Xóa các tệp cũ hơn X ngày +


143

Tôi đã tìm thấy lệnh xóa các tệp cũ hơn 5 ngày trong một thư mục

find /path/to/files* -mtime +5 -exec rm {} \;

Nhưng làm thế nào để tôi cũng làm điều này cho các thư mục con trong thư mục đó?


Bạn có nghĩa là các tập tin trong các thư mục phụ? hoặc các thư mục phụ mình?
rahul

3
find /path/to -type d -empty -delete
Costas

2
Xóa các tệp trong thư mục con cũng đã hơn 5 ngày tuổi
Teddy291

3
Có thể thú vị khi tôi có tập tin với không gian. Ví dụ: một tệp có tên "test one" và rm được cho ăn rm test one. (Sẽ xóa một tệp có tên "test" và một tệp gọi là "one", nhưng không phải là một tệp có tên "test one"). Gợi ý: -delete hoặc -print0
Hennes

6
Lưu ý phụ, luôn trích dẫn đối số được cung cấpfind để tránh các vấn đề với các ký tự đặc biệt, như được đề cập trong dòng đầu tiên của câu trả lời. Ví dụ:find /path/to/files/ -exec somecommand '{}' \;
Walf

Câu trả lời:


240

Hãy cẩn thận với tên tệp đặc biệt (dấu cách, dấu ngoặc kép) khi đường ống đến rm.

Có một sự thay thế an toàn - tùy chọn -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

Đó là nó, không có cuộc gọi rm riêng biệt và bạn không cần phải lo lắng về tên tệp.

Thay thế -deletebằng -depth -printđể kiểm tra lệnh này trước khi bạn chạy nó ( -deletengụ ý -depth).


23
Đồng thời chỉ sử dụng -type fđể xóa các tệp (và giữ các thư mục phụ)
Oleg

3
Ngoài ra, nếu bạn muốn làm tương tự cho tất cả các tệp MỚI hơn năm ngày: find / path / to / thư mục / -mindepth 1 -mtime -5 -delete
zmonteca

Nếu đường dẫn của tôi chứa khoảng trắng thì tôi phải làm thế nào? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio

3
@ uom-pgregorio Tôi muốn đề nghị đặt đường dẫn trong dấu ngoặc kép.
atripes

4
Lưu ý rằng mọi findđối số là một bộ lọc sử dụng kết quả của bộ lọc trước đó làm đầu vào. Vì vậy, hãy chắc chắn rằng bạn thêm -delete làm đối số cuối cùng. IE: find . -delete -mtime +5sẽ xóa MỌI THỨ trong đường dẫn hiện tại.
Johan

15

Lưu ý rằng lệnh này sẽ không hoạt động khi tìm thấy quá nhiều tệp. Nó sẽ mang lại một lỗi như:

bash: /usr/bin/find: Argument list too long

Có nghĩa là giới hạn cuộc gọi của hệ thống exec trên độ dài của một dòng lệnh đã bị vượt quá. Thay vì thực hiện rm theo cách đó, sử dụng xargs sẽ hiệu quả hơn rất nhiều . Đây là một ví dụ hoạt động:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Thao tác này sẽ xóa tất cả các tệp (loại f) được sửa đổi lâu hơn 14 ngày trước dưới / root / Maildir / đệ quy từ đó và sâu hơn (mindepth 1). Xem hướng dẫn tìm kiếm để có thêm tùy chọn .


7
Câu trả lời của mỗi @ AfshinHamedi trên AskUbfox ( Askubfox.com/questions/589210/removing-files-older-than-7-day ), hãy cẩn thận với các tệp chứa dòng mới và ký tự đặc biệt. Thay vào đó hãy sử dụngfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe

2
Hoặc chỉ cần thêm '+' vào kết quả tìm kiếm
Dani_l

8

Nó giống nhau. Bạn chỉ cần cung cấp thư mục mẹ chứ không phải tiền tố của tệp. Trong ví dụ của bạn, nó sẽ là:

find /path/to -type f -mtime +5 -exec rm {} \;

Điều này sẽ xóa tất cả các tệp cũ hơn 5 ngày /path/tovà các thư mục con của nó.

Để xóa các thư mục con trống, hãy tham khảo bình luận @Costas ở trên.


4
Lưu ý rằng đối với mỗi và mọi tệp bạn sẽ thực thi lệnh rm. Nếu bạn có 1000 tệp cũ hơn 5 ngày thì rm sẽ bắt đầu 1000 lần. Vì lý do này, hãy xem xét tùy chọn -delete như trong nhận xét của Costa hoặc -exec rm {} \ +
Hennes

@ Hennes: - 1) không chắc bạn cần thoát +trong trường hợp đó. - 2) tốt hơn để viết -exec rm '{}' +để chống lại sự xấu xa của các tệp có ký tự đặc biệt (dấu cách, dòng mới, v.v.) trong tên của chúng.
Cbhihe

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.