Wie bekomme ich auf einfachste Weise fünf Dateien mit den meisten Zeilen im aktuellen Verzeichnis?

Jan 09 2021

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

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

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
pwnosh Jan 09 2021 at 16:42

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
Theo Jan 09 2021 at 18:35

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