Câu trả lời:
Tôi sẽ sử dụng find dirname -not -empty -ls, giả sử GNU tìm thấy.
lsvà 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 0byte. 0có 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 ftắ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 -printchuyển đổi là không thực sự cần thiết.
-maxdepth 1trước -size +0. Cũng -printlà hành động mặc định, vì vậy nó không cần thiết.
findkhá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 -sizetrướ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 Lvò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 lskhô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