Bagaimana cara mendapatkan lima file dengan baris terbanyak di direktori saat ini dengan cara yang paling sederhana?

Jan 09 2021

Ada perintah shell seperti itu dalam bab "pemrograman transformasional" dari "The Pragmatic Programmer".

Fungsinya untuk membuat daftar lima file dengan baris terbanyak di direktori saat ini.

$ 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

Saya mencoba melakukan hal yang sama dengan PowerShell , Tapi sepertinya terlalu bertele-tele

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

Saya yakin akan ada cara yang lebih sederhana, tetapi saya tidak dapat memikirkannya.

Bagaimana cara mendapatkan file dengan sebagian besar baris di direktori saat ini dengan cara termudah menggunakan PowerShell?

Tentu saja, Anda tidak perlu menggunakan alias dan singkatan khusus untuk mempersingkat panjangnya. Meski terlihat lebih ringkas, ia kehilangan keterbacaan.

Jawaban

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

Saya akhirnya menemukan jawaban saya yang memuaskan!

Digunakan 3 operator pipa, shell digunakan 5!

Terlebih lagi, yang kami dapatkan adalah objeknya, yang dapat digunakan untuk operasi yang lebih dapat diperluas.

Saya merasa lebih baik daripada kulit linux.

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

Coba File.ReadLines dengan Linq atau File.ReadAllLines dengan properti 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

Pendekatan cepat akan menggunakan 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