Geçerli dizinde en çok satıra sahip beş dosya en basit şekilde nasıl elde edilir?
"The Pragmatik Programmer" ın "dönüşümsel programlama" bölümünde böyle bir kabuk komutu var.
İşlevi, geçerli dizinde en çok satıra sahip beş dosyayı listelemektir.
$ 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
PowerShell ile aynı şeyi yapmaya çalışıyorum , Ama çok uzun görünüyor
(Get-ChildItem .\ | ForEach-Object {$_ | Select-Object -Property 'Name', @{label = 'Lines'; expression = {($_ | Get-Content).Length}}} |Sort-Object -Property 'Lines')|Select-Object -Last 5
Daha basit bir yol olacağına inanıyorum ama bunu düşünemiyorum.
PowerShell kullanarak geçerli dizinde en çok satıra sahip dosyalar en basit şekilde nasıl elde edilir?
Elbette, uzunluğu kısaltmak için özel takma adlar ve kısaltmalar kullanmanıza gerek yoktur. Daha kısa görünmesine rağmen okunabilirliğini kaybeder.
Yanıtlar
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
Sort-Object Count | Select-Object -Last 5
Sonunda kendi tatmin edici cevabımı buldum!
3 boru hattı operatörü kullanıldı, kabuk 5 kullanıldı!
Dahası, elde ettiğimiz şey, daha genişletilebilir işlemler için kullanılabilen nesnedir.
Linux kabuğundan daha iyi hissediyorum.
dir -file | sort {($_ | gc).Length} | select -l 5
Linq ile File.ReadLines veya Count özelliğine sahip File.ReadAllLines'ı deneyin.
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
Hızlı bir yaklaşım switch -File
şunları kullanmak olacaktır :
$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