Geçerli dizinde en çok satıra sahip beş dosya en basit şekilde nasıl elde edilir?

Jan 09 2021

"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

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

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
pwnosh Jan 09 2021 at 16:42

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
Theo Jan 09 2021 at 18:35

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