Tôi cần xóa các tệp cũ hơn 3 ngày với một công việc định kỳ trong 3 thư mục khác nhau. (3 thư mục này là con của thư mục mẹ /a/b/c/1
& /a/b/c/2
& /a/b/c/3
) Điều này có thể được thực hiện với một dòng trong crontab không?
Tôi cần xóa các tệp cũ hơn 3 ngày với một công việc định kỳ trong 3 thư mục khác nhau. (3 thư mục này là con của thư mục mẹ /a/b/c/1
& /a/b/c/2
& /a/b/c/3
) Điều này có thể được thực hiện với một dòng trong crontab không?
Câu trả lời:
Điều này là đủ dễ dàng (mặc dù lưu ý rằng điều này diễn ra trong thời gian sửa đổi hơn 3 ngày trước vì thời gian tạo chỉ có sẵn trên một số hệ thống tệp nhất định với các công cụ đặc biệt):
find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete
Xóa #
trước -delete
khi bạn chắc chắn rằng nó đang tìm các tệp bạn muốn xóa.
Để chạy nó bằng cron, có lẽ tôi chỉ cần tạo một tập lệnh thực thi (thêm một shebang - #!bin/sh
vào dòng trên cùng của tệp và thực hiện với chmod a+x
), sau đó đặt nó vào một cron
thư mục thích hợp như /etc/cron.daily
hoặc /etc/cron.weekly
. Tất nhiên với điều kiện là bạn không cần một lịch trình cụ thể hơn và các thư mục này tồn tại trên bản phân phối của bạn.
Như đã lưu ý dưới đây, -delete
tùy chọn cho việc find
không di động. Cách tiếp cận tương thích POSIX sẽ là:
find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +
Một lần nữa loại bỏ #
khi bạn chắc chắn rằng bạn có các tập tin đúng.
Để trích dẫn từ Stéphane Chazelas bình luận dưới đây:
Lưu ý rằng
-exec rm {} +
có các lỗ hổng điều kiện chủng tộc mà-delete
(nếu có) không có. Vì vậy, đừng sử dụng nó trên các thư mục mà người khác có thể ghi. Một số tìm thấy cũng có một-execdir
giảm nhẹ chống lại những lỗ hổng.
/a/b/c/[12]
, nhưng điều này chỉ thực sự phù hợp nếu các thư mục con có tên chữ cái duy nhất. Trong bash
bạn có thể làm /a/b/c/{1,2}
. Tất nhiên sau đó, dòng bang cho một kịch bản sẽ phải là #!/bin/bash
hoặc nếu bạn đang sử dụng crontab, bạn cần đảm bảo rằng nó được cấu hình để sử dụng bash
(tôi thực sự không khuyên bạn nên thay đổi nó nếu không).
ksh
, bash
Và zsh
cũng có nhà khai thác luân phiên trong những đống của họ. Lưu ý rằng -exec rm {} +
có các lỗ hổng điều kiện chủng tộc mà -delete
(nếu có) không có. Vì vậy, đừng sử dụng nó trên các thư mục mà người khác có thể ghi. Một số tìm thấy cũng có một -execdir
giảm nhẹ chống lại những lỗ hổng.
rm -f
âm thầm xử lý lỗi, do đó xử lý bất kỳ điều kiện cuộc đua có thể với -exec
?
Bạn sẽ tốt hơn nhiều khi sử dụng tmpwatch
tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.
tmpwatch
đã được rẽ nhánh tmpreaper
, mà (ít nhất là trên Debian) dường như là sự thay thế.
/a/b/c/
không phải chỉ định cho mọi tùy chọn không?