¿Cómo obtener cinco archivos con la mayoría de las líneas en el directorio actual de la manera más sencilla?

Jan 09 2021

Hay un comando de shell de este tipo en el capítulo "programación transformacional" de "El programador pragmático".

Su función es listar los cinco archivos con más líneas en el directorio actual.

$ 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

Estoy tratando de hacer lo mismo con PowerShell, pero parece demasiado prolijo

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

Creo que habrá una forma más sencilla, pero no se me ocurre.

¿Cómo obtener archivos con la mayoría de las líneas en el directorio actual de la manera más sencilla usando PowerShell?

Por supuesto, no es necesario utilizar alias y abreviaturas personalizados para acortar la longitud. Aunque parece más conciso, pierde legibilidad.

Respuestas

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 encontré mi propia respuesta satisfactoria!

Usó 3 operadores de tubería, shell usó 5!

Además, lo que obtenemos es el objeto, que se puede usar para operaciones más extensibles.

Me siento mejor que Shell de Linux.

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

Pruebe File.ReadLines con Linq o File.ReadAllLines con la propiedad 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 enfoque rápido sería utilizar 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