Bagaimana cara mendapatkan lima file dengan baris terbanyak di direktori saat ini dengan cara yang paling sederhana?
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
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
Sort-Object Count | Select-Object -Last 5
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
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
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