Come ottenere cinque file con la maggior parte delle righe nella directory corrente nel modo più semplice?
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
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
Sort-Object Count | Select-Object -Last 5
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
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
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