Làm thế nào để có được năm tệp với hầu hết các dòng trong thư mục hiện tại bằng cách đơn giản nhất?

Jan 09 2021

Có một lệnh shell như vậy trong chương "lập trình biến đổi" của "Lập trình viên thực dụng".

Chức năng của nó là liệt kê năm tệp có nhiều dòng nhất trong thư mục hiện tại.

$ 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

Tôi đang cố gắng làm điều tương tự với PowerShell , Nhưng có vẻ quá dài dòng

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

Tôi tin rằng sẽ có một cách đơn giản hơn, nhưng tôi không thể nghĩ ra.

Làm cách nào để lấy tệp có hầu hết các dòng trong thư mục hiện tại bằng cách đơn giản nhất bằng PowerShell?

Tất nhiên, bạn không cần phải sử dụng bí danh và chữ viết tắt tùy chỉnh để rút ngắn độ dài. Mặc dù nó trông ngắn gọn hơn, nhưng nó làm mất đi tính dễ đọc.

Trả lời

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

Cuối cùng tôi đã tìm được câu trả lời thỏa đáng cho riêng mình!

Đã sử dụng 3 nhà khai thác đường ống, vỏ được sử dụng 5!

Hơn nữa, những gì chúng ta nhận được là đối tượng, có thể được sử dụng cho các hoạt động mở rộng hơn.

Tôi cảm thấy tốt hơn so với shell của linux.

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

Hãy thử thuộc tính File.ReadLines với Linq hoặc File.ReadAllLines với 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

Một cách tiếp cận nhanh sẽ là sử dụng 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