Comment obtenir cinq fichiers avec la plupart des lignes dans le répertoire actuel de la manière la plus simple?
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
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
Sort-Object Count | Select-Object -Last 5
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
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
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