Comment obtenir cinq fichiers avec la plupart des lignes dans le répertoire actuel de la manière la plus simple?

Jan 09 2021

Il existe une telle commande shell dans le chapitre "programmation transformationnelle" de "Le programmeur pragmatique".

Sa fonction est de lister les cinq fichiers avec le plus de lignes dans le répertoire courant.

$ 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

J'essaie de faire la même chose avec PowerShell , Mais cela semble trop verbeux

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

Je crois qu'il y aura un moyen plus simple, mais je ne peux pas y penser.

Comment obtenir des fichiers avec la plupart des lignes dans le répertoire actuel de la manière la plus simple à l'aide de PowerShell?

Bien sûr, vous n'avez pas besoin d'utiliser des alias et des abréviations personnalisés pour raccourcir la longueur. Bien qu'il semble plus concis, il perd en lisibilité.

Réponses

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

J'ai enfin trouvé ma propre réponse satisfaisante!

Utilisé 3 opérateurs de pipeline, shell utilisé 5!

De plus, nous obtenons l'objet, qui peut être utilisé pour des opérations plus extensibles.

Je me sens mieux que shell de linux.

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

Essayez File.ReadLines avec Linq ou File.ReadAllLines avec la propriété 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

Une approche rapide consisterait à utiliser 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