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?
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
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
Sort-Object Count | Select-Object -Last 5
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
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
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