Làm thế nào để tìm tất cả các tệp và thư mục trống trong một thư mục cụ thể bao gồm các tệp trông trống rỗng nhưng không phải?


18

Giả sử trong thư mục của ~/listtôi, tôi có một số lượng lớn các thư mục với các thư mục con và thư mục con riêng, v.v., và có rất nhiều tệp gần như ở mỗi cấp. Tuy nhiên, một số tệp và thư mục này trống, vậy làm cách nào tôi có thể tìm kiếm đệ quy qua tất cả chúng để tìm các tệp và thư mục trống? Và sau đó để chúng hiển thị trong một danh sách các vị trí tệp để tôi biết vị trí của từng vị trí (cũng nên rõ ràng đó là tệp nào và thư mục nào vì không phải tất cả các tệp đều có phần mở rộng tệp). Tôi đang chạy Ubuntu Gnome 15.10 với Gnome 3.18.

Xin lưu ý rằng nó cũng sẽ rất hữu ích nếu nó cũng cho tôi biết nếu một tệp trông trống rỗng nhưng không (ví dụ nếu nó có khoảng trắng hoặc ngắt dòng trong đó hoặc một cái gì đó). Và sẽ phân biệt giữa một tập tin trống thực sự và một tập tin trông trống rỗng trong đầu ra.


1
Một tập tin trống, là một tập tin không có ký tự? (có thể là dấu cách, dấu ngắt dòng và tab)?
Jacob Vlijm

@JacobVlijm: Chà, trước đây tôi chỉ nghĩ các tệp có 0 byte, nhưng bây giờ khi bạn đề cập đến nó, ai đó có thể đã đủ điên rồ để đưa cho tôi một tệp có dấu cách hoặc ngắt dòng hoặc thứ gì đó, vì vậy tôi cũng muốn phát hiện ra những tệp đó, nhưng tôi muốn đầu ra phân biệt giữa một tập tin trống thực sự và một tập tin trông trống rỗng.

Câu trả lời:


25

Từ man find

    -empty File is empty and is either a regular file or a directory.

Vì vậy, để tìm cả tập tin và thư mục trống, nó là đủ để làm

find ~/lists -empty

Để chỉ ra loại, bạn có thể sử dụng công %ycụ xác định định dạng đầu ra

          %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

ví dụ

find ~/lists -empty -printf '%y %p\n'

hoặc sử dụng một chương trình bên ngoài như ls, bao gồm một --classifytùy chọn

    -F, --classify
          append indicator (one of */=>@|) to entries

I E

find ~/lists -empty -exec ls -Fd {} \;

Nếu định nghĩa 'trống' của bạn được mở rộng để bao gồm các tệp chỉ chứa các ký tự khoảng trắng, thì nó sẽ trở nên phức tạp hơn - và chuyên sâu hơn về mặt tính toán, vì bây giờ bạn cần thực sự mở ít nhất bất kỳ tệp không trống nào và kiểm tra nội dung của chúng. Cách hiệu quả nhất mà tôi có thể nghĩ ra khỏi đỉnh đầu sẽ là một cái gì đó như

find ~/list \( -empty -o \( -type f -a ! -exec grep -qm1 '[^[:blank:]]' {} \; \) \) -exec ls -Fd {} \;

(trống, HOẶC một tệp VÀ grep không phát hiện ít nhất một ký tự không trống). Có khả năng có một cách tốt hơn mặc dù.


Xin lỗi, tôi đã bỏ lỡ điều gì đó, xin vui lòng xem phiên bản chỉnh sửa của câu hỏi của tôi. Nó không nên là quá nhiều để thêm.

11

Từ ~/listthư mục:

find . -empty -type d

để liệt kê các thư mục trống và

find . -empty -type f

để liệt kê các tập tin trống.

find . -type f -exec bash -c 'if [ `cat "{}" |wc -w` -eq 0 ]; then echo "file - {}";fi' \; -or -empty -exec bash -c "echo dir - {}" \; 

để liệt kê các thư mục và tệp trống bao gồm cả khoảng trắng và dòng trống


Và điều này sẽ liệt kê đệ quy các thư mục con và nội dung của chúng?

điều này sẽ hiển thị đệ quy các tệp và thư mục trống
EdiD

Xin lỗi, tôi đã bỏ lỡ điều gì đó, xin vui lòng xem phiên bản chỉnh sửa của câu hỏi của tôi. Nó không nên là quá nhiều để thêm.

[ `grep -c [[:alnum:]] "{}"` -eq 0 ]sẽ cho phép thông qua các tệp chỉ chứa các ký tự không có trong [A-Za-z0-9]tập hợp.
kos

@kos - có lẽ đồ thị thay vì alnum sẽ thực hiện công việc
EdiD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.