Câu trả lời:
Tôi sẽ sử dụng find dirname -not -empty -ls
, giả sử GNU tìm thấy.
ls
và bạn đã sử dụng find
;) Tôi đã bật lên ... Đó là một giải pháp thích hợp
Đây là một công việc để tìm ls không đủ mạnh.
find -maxdepth 1 -size +0 -print
-maxdepth 1
- điều này cho biết chỉ tìm kiếm thư mục hiện tại, loại bỏ để tìm trong tất cả các thư mục con hoặc thay đổi số để giảm xuống 2, 3 hoặc nhiều cấp độ.
-size +0
điều này cho biết tìm kiếm các tệp có kích thước lớn hơn 0
byte. 0
có thể được thay đổi thành bất kỳ kích thước nào bạn muốn.
-print
nói với tìm để in ra đường dẫn đầy đủ đến tập tin mà nó tìm thấy
Chỉnh sửa:
Bổ sung muộn: Có lẽ bạn cũng nên thêm công -type f
tắc ở trên. Điều này cho biết chỉ tìm thấy tập tin. Và như đã lưu ý trong các bình luận dưới đây, việc -print
chuyển đổi là không thực sự cần thiết.
-maxdepth 1
trước -size +0
. Cũng -print
là hành động mặc định, vì vậy nó không cần thiết.
find
khác nhau rất nhiều về các tùy chọn hợp lệ là gì và nơi chúng có thể đi. GNU find
(rất phổ biến) sẽ đưa ra cảnh báo nếu bạn đặt -size
trước -maxdepth
.
Ls gần như không có tùy chọn để lọc các tệp: đó không phải là công việc của nó. Lọc các tập tin là công việc của trình bao cho các trường hợp đơn giản (thông qua toàn cầu) và công việc tìm kiếm cho các trường hợp phức tạp.
Trong zsh, bạn có thể sử dụng L
vòng loại toàn cầu để chỉ giữ lại các tệp có kích thước> 0 ( .
vòng loại giới hạn ở các tệp thông thường):
ls *(.L+0)
Người dùng của các shell khác phải sử dụng find. Với GNU find (như được tìm thấy chủ yếu trên Linux):
find -maxdepth 1 -type f ! -empty -exec ls {} +
Một cách tuân thủ POSIX là:
find . -type f -size +0c -exec ls {} + -o -name . -o -prune
Nếu ls
không chỉ là một ví dụ và bạn chỉ có ý định kiểm tra trực quan, bạn có thể sắp xếp theo kích thước : ls -S
.
Bash 4.0+
shopt -s globstar
shopt -s nullglob
for file in **/*; do test -f "$file" && [[ -s "$file" ]] && echo "$file"; done