Wie bekomme ich auf einfachste Weise fünf Dateien mit den meisten Zeilen im aktuellen Verzeichnis?
Einen solchen Shell-Befehl gibt es im Kapitel "Transformationsprogrammierung" von "The Pragmatic Programmer".
Seine Funktion besteht darin, die fünf Dateien mit den meisten Zeilen im aktuellen Verzeichnis aufzulisten.
$ 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
Ich versuche das Gleiche mit PowerShell zu tun. Aber es scheint zu wortreich
(Get-ChildItem .\ | ForEach-Object {$_ | Select-Object -Property 'Name', @{label = 'Lines'; expression = {($_ | Get-Content).Length}}} |Sort-Object -Property 'Lines')|Select-Object -Last 5
Ich glaube, es wird einen einfacheren Weg geben, aber ich kann mir das nicht vorstellen.
Wie kann ich mit PowerShell auf einfachste Weise Dateien mit den meisten Zeilen im aktuellen Verzeichnis abrufen?
Natürlich müssen Sie keine benutzerdefinierten Aliase und Abkürzungen verwenden, um die Länge zu verkürzen. Obwohl es prägnanter aussieht, verliert es an Lesbarkeit.
Antworten
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
Sort-Object Count | Select-Object -Last 5
Ich habe endlich meine eigene zufriedenstellende Antwort gefunden!
Verwendet 3 Pipeline-Betreiber, Shell verwendet 5!
Darüber hinaus erhalten wir das Objekt, das für erweiterbare Operationen verwendet werden kann.
Ich fühle mich besser als Shell von Linux.
dir -file | sort {($_ | gc).Length} | select -l 5
Probieren Sie entweder File.ReadLines mit Linq oder File.ReadAllLines mit Count-Eigenschaft aus.
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
Ein schneller Ansatz wäre 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