2012-09-19 11 views
8

Tôi có thư mục tạm thời đầy đủ các thư rác mà tất cả bắt đầu bằng __temp__ (ví dụ: __temp__user_uploads), mà tôi muốn xóa bằng chức năng dọn dẹp. nỗ lực chức năng của tôi là để chạy:Làm cách nào để sử dụng lệnh `find` trong Linux để xóa các thư mục không trống?

find . -name __temp__* -exec rm -rf '{}' \; 

Nếu tôi chạy lệnh và có nhiều __temp__ thư mục (__temp__foo__temp__bar), tôi nhận được kết quả:

find: __temp__foo: unknown option 

Nếu tôi chạy lệnh và có chỉ 1 __temp__ thư mục (__temp__foo), nó sẽ bị xóa và tôi nhận được kết quả:

find: ./__temp__foo: No such file or directory 

Tại sao lệnh không hoạt động, tại sao nó không phù hợp như vậy, và làm thế nào tôi có thể sửa nó?

Trả lời

25

Sử dụng tìm kiếm theo chiều sâu và trích dẫn (hoặc thoát khỏi) các metacharater vỏ *:

find . -depth -name '__temp__*' -exec rm -rf '{}' \; 

Giải thích

Nếu không có sự -depth cờ, find lệnh của bạn sẽ loại bỏ tên tập tin phù hợp và sau đó thử để đi sâu vào các thư mục (hiện đã hủy liên kết). Đó là nguồn gốc của "Không có tệp hoặc thư mục như vậy" trong trường hợp thư mục __temp__ duy nhất của bạn.

Không có trích dẫn hoặc thoát khỏi *, vỏ sẽ mở rộng mẫu đó, khớp với một số tên tệp __temp__whatever trong thư mục làm việc hiện tại. Việc mở rộng này sẽ gây nhầm lẫn find, đó là các tùy chọn mong đợi thay vì tên tệp tại thời điểm đó trong danh sách đối số của nó.

+6

Là một cải tiến hiệu quả và chặt chẽ, giả sử các tiện ích GNU (kể từ khi OP là trên Linux), tôi thực sự khuyên bạn nên 'tìm. -maxdepth 1-type d -name '__temp __ *' -print0 | xargs -0 rm -rf'. – pilcrow

+0

+1 để đề xuất xarg thay vì -exec –

+0

@AshishKumar - tại sao +1 cho xarg? Có phải '-exec' không phải là một tính năng tốt của' tìm'? pilcrow, cảm ơn lời giải thích! – orokusaki