¿Cómo obtener cinco archivos con la mayoría de las líneas en el directorio actual de la manera más sencilla?
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
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
Sort-Object Count | Select-Object -Last 5
¡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
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
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