Làm cách nào để tôi thực hiện Tìm kiếm loại trừ thư mục mà nó tìm kiếm?


18

Tôi đang chạy lệnh sau:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Tôi muốn xóa tất cả các thư mục trong processingthư mục (thư mục xử lý sẽ không bao giờ bị xóa).

Lệnh này cũng đang xóa processingthư mục. Làm cách nào để giới hạn tập lệnh chỉ xóa các thư mục trong thư mục đó?


Câu trả lời:


32

Cách dễ nhất là chỉ cần thêm -mindepth 1, sẽ bỏ qua hệ thống phân cấp độ sâu đầu tiên và do đó loại bỏ thư mục mẹ của bạn.

Ngoài ra, bạn không cần thêm một -execcuộc gọi đến rm, bạn chỉdelete có thể trực tiếp các thư mục nếu chúng trống.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Nếu chúng không trống:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Nếu bạn lười biếng, bạn cũng có thể mở rộng ký tự đại diện. Vì *không bao gồm thư mục hiện tại theo mặc định ( trừ khi dotglobđược đặt ), bạn cũng có thể làm:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Tuy nhiên, điều này cũng sẽ không bao gồm các thư mục ẩn, một lần nữa do dotglobtùy chọn.


Xin chào, tôi nhận được "find: warning: bạn đã chỉ định tùy chọn -mindepth sau một đối số không phải tùy chọn -type, nhưng các tùy chọn không theo vị trí (-mindepth ảnh hưởng đến các thử nghiệm được chỉ định trước nó cũng như các tùy chọn được chỉ định sau nó). trước các đối số khác. "và cũng" tìm: không thể xóa `/ thư mục / 50d82faf0e09e ': Thư mục không trống"
Elad Dotan

Thêm mindepth trước khi gõ rồi. Để xóa các thư mục khi không trống, bạn có thể sử dụng phương pháp rm ban đầu.
slhck

4

Vấn đề là find trả về thư mục hiện tại (.) Cùng với các thư mục khác, vì vậy nó xóa thư mục xử lý cũng như các thư mục con. Một cách nhanh chóng để có được xung quanh đó là nối thêm tùy chọn

-not -name .

mà dừng tìm thấy từ đầu ra thư mục hiện tại, và lần lượt ngăn chặn nó bị xóa.

Điều đó sẽ hoạt động nếu bạn đang chạy lệnh trong thư mục xử lý, do đó, để cho phép thực tế là bạn đang sử dụng một đường dẫn tuyệt đối:

-not -name /var/www/html/content/processing

Và toàn bộ lệnh sẽ là:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;

Lệnh cuối cùng là sai. -nameđề cập đến tên cơ sở, nó không bao giờ khớp với bất cứ thứ gì có dấu gạch chéo. Bạn có thể cần phải sử dụng -path.
Kamil Maciorowski

1

Đã trả lời, tôi vẫn muốn liệt kê một cách tiếp cận khác.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Điều này sẽ loại trừ thư mục trên cùng (và cả thư mục con), và bây giờ bạn có thể áp dụng bất kỳ lệnh nào mà chúng tôi muốn áp dụng trên nó.

>> Tùy chọn:
-mindepth 1: Để loại trừ thư mục gốc
-maxdepth 1: Để tránh phân tích thư mục con. (Đối với kịch bản cụ thể như được hỏi, bạn không cần điều này).
-type d: Chỉ liệt kê các loại thư mục. Tùy chọn này sẽ xuất hiện sau khi sử dụng maxdepth mindepth.


Tại sao -maxdepth 1? Tại sao -type dhai lần? Điều này khác với câu trả lời được chấp nhận như thế nào?
Attie

@Attie: Cảm ơn, đã sửa lỗi. maxdepth là không cần thiết, nhưng nó sẽ hữu ích nếu bạn muốn tránh liệt kê các thư mục con.
prashant
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.