Come ottenere cinque file con la maggior parte delle righe nella directory corrente nel modo più semplice?

Jan 09 2021

C'è un tale comando di shell nel capitolo "programmazione trasformazionale" di "The Pragmatic Programmer".

La sua funzione è quella di elencare i cinque file con il maggior numero di righe nella directory corrente.

$ find . -type f | xargs wc -l | sort -n | tail -6 | head -5
     470 ./debug.pml
     470 ./test_to_build.pml
     487 ./dbc.pml
     719 ./domain_languages.pml
     727 ./dry.pml

Sto cercando di fare la stessa cosa con PowerShell , Ma sembra troppo prolisso

(Get-ChildItem .\ | ForEach-Object {$_ | Select-Object -Property 'Name', @{label = 'Lines'; expression = {($_ | Get-Content).Length}}} |Sort-Object -Property 'Lines')|Select-Object -Last 5

Credo che ci sarà un modo più semplice, ma non riesco a pensarci.

Come ottenere file con la maggior parte delle righe nella directory corrente nel modo più semplice utilizzando PowerShell?

Ovviamente, non è necessario utilizzare alias e abbreviazioni personalizzati per accorciare la lunghezza. Anche se sembra più conciso, perde leggibilità.

Risposte

2 iRon Jan 09 2021 at 20:05
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
    Sort-Object Count | Select-Object -Last 5
1 if_ok_button Jan 10 2021 at 09:02

Finalmente ho trovato la mia risposta soddisfacente!

Utilizzati 3 operatori di pipeline, shell usata 5!

Inoltre, ciò che otteniamo è l'oggetto, che può essere utilizzato per operazioni più estensibili.

Mi sento meglio di shell of linux.

dir -file | sort {($_ | gc).Length} | select -l 5
pwnosh Jan 09 2021 at 16:42

Prova File.ReadLines con Linq o File.ReadAllLines con la proprietà Count.

File.ReadLines

Get-ChildItem .\ -File | 
    Select-Object -Property Name, @{n='Lines'; e= { 
            [System.Linq.Enumerable]::Count([System.IO.File]::ReadLines($_.FullName)) 
        } 
    } | Sort-Object -Property 'Lines' -Descending | Select-Object -First 5

File.ReadAllLines

Get-ChildItem .\ -File | 
    Select-Object -Property Name, @{n='Lines'; e= { 
            [System.IO.File]::ReadAllLines($_.FullName).Count 
        } 
    } | Sort-Object -Property 'Lines' -Descending | Select-Object -First 5
Theo Jan 09 2021 at 18:35

Un approccio veloce potrebbe essere quello di utilizzare switch -File:

$files = (Get-ChildItem -File ).FullName $result = foreach ($file in $files) {
    $lineCount = 0 switch -File $file {
        default { $lineCount++ } } [PsCustomObject]@{ File = $file
        Lines = $lineCount } } $result | Sort-Object Lines | Select-Object -Last 5