วิธีการรับห้าไฟล์ที่มีบรรทัดส่วนใหญ่ในไดเร็กทอรีปัจจุบันโดยวิธีที่ง่ายที่สุด?

Jan 09 2021

มีคำสั่งเชลล์ดังกล่าวในบท "การเขียนโปรแกรมการเปลี่ยนแปลง" ของ "The Pragmatic Programmer"

หน้าที่ของมันคือแสดงรายการไฟล์ห้าไฟล์ที่มีบรรทัดมากที่สุดในไดเร็กทอรีปัจจุบัน

$ 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, แต่ดูเหมือนว่าจะใช้คำพูดมากเกินไป

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

ฉันเชื่อว่าจะมีวิธีที่ง่ายกว่านี้ แต่ฉันคิดไม่ออก

วิธีรับไฟล์ที่มีบรรทัดส่วนใหญ่ในไดเร็กทอรีปัจจุบันด้วยวิธีที่ง่ายที่สุดโดยใช้ PowerShell

แน่นอนคุณไม่จำเป็นต้องใช้นามแฝงและตัวย่อที่กำหนดเองเพื่อลดความยาว แม้ว่าจะดูกระชับกว่า แต่ก็สูญเสียความสามารถในการอ่าน

คำตอบ

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

ในที่สุดฉันก็พบคำตอบที่น่าพอใจของตัวเอง!

ใช้ 3 ตัวดำเนินการไปป์ไลน์เชลล์ใช้ 5!

ยิ่งไปกว่านั้นสิ่งที่เราได้รับคือวัตถุซึ่งสามารถใช้สำหรับการดำเนินการที่ขยายได้มากขึ้น

ฉันรู้สึกดีกว่าเปลือกของลินุกซ์

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

ลองใช้ File.ReadLines ด้วย Linq หรือ File.ReadAllLines ที่มีคุณสมบัติ 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

แนวทางที่รวดเร็วจะใช้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