Tự động xóa các tập tin cũ hơn 7 ngày


17

Tôi là một noob hoàn chỉnh tại linux nhưng tôi bắt đầu hiểu rõ về nó. Tôi có Ubuntu Server 16.04 đang chạy máy chủ FTP để sao lưu các tệp video bảo mật. Các tập tin sẽ được lưu trữ trong các thư mục như: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3và vân vân.

Lưu ý rằng mỗi người securityfolderNlà một người dùng khác nhau.

Vì tôi không muốn ổ cứng của mình luôn đầy, tôi muốn xóa các tệp cũ hơn 7 ngày trong các thư mục này hàng ngày.


/homethường chứa một thư mục con cho mỗi người dùng. Nếu bạn không muốn lưu trữ bản sao lưu của mình dưới dạng người dùng khác (ý ​​tưởng không thực sự tốt), bạn nên xem xét một vị trí khác, /home/security/backup1v.v.
Melebius

@Melebius cảm ơn bạn đã bình luận, mỗi / securityfolder là một người dùng khác, tôi quên đề cập đến điều đó.
Jacco van de Wijgaart

Câu trả lời:


26

Đầu tiên, lệnh này sẽ tìm và xóa tất cả các tệp cũ hơn 7 ngày trong bất kỳ thư mục con nào /homecó tên bắt đầu bằng securityuser:

find /home/securityuser* -mtime +6 -type f -delete

Bạn cần -mtime +6và không phải +7-mtimetính thời gian 24h. Như đã giải thích trong -atimephần của man find( -mtimehoạt động theo cùng một cách):

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

Vì vậy, để tìm một tệp đã được sửa đổi 7 ngày trở lên, bạn cần tìm các tệp đã được sửa đổi hơn 6 ngày trước, do đó -mtime +6.

Bước tiếp theo là chạy lệnh này mỗi ngày một lần. Vì mỗi securityuserNngười dùng là một người dùng khác nhau (bạn có thể muốn suy nghĩ lại về thiết lập đó, nó làm cho mọi thứ phức tạp hơn), điều này phải được chạy dưới quyền root. Vì vậy, chỉnh sửa /etc/crontab:

sudo nano /etc/crontab

Và thêm dòng này:

@daily root find /home/securityuser* -mtime +6 -type f -delete

Điều đó sẽ chạy findlệnh một lần một ngày và xóa các tập tin.


+1 Điều khiển móng sâu hơn một chút và có thể nhắc lại đề xuất của Melebius với OP, rằng find '/home/securityuser/*' -mtime +6 -type f -delete(với tất cả các thay đổi thích hợp và phù hợp trong việc tạo người dùng) nói chung có thể là một ý tưởng tốt hơn find '/home/securityuser*' -mtime +6 -type f -delete(không có dấu gạch chéo trong đường dẫn) ...?
Cbhihe

@Cbhihe không, các thư mục đích được gọi /home/securityuserN, vì vậy không có dấu gạch chéo, chúng sẽ không được tìm thấy.
terdon

yup, đã thấy rằng; chỉ không nghĩ rằng đó là một cách thực hành tốt về phần của OP (tạo một người dùng riêng cho mỗi video bảo mật, v.v ...) dọc theo dòng bình luận đầu tiên của Melebius, mặc dù OP có thể có lý do để làm như vậy. Nếu bất cứ điều gì bình luận của tôi là khập khiễng, không phải là một lời chỉ trích về câu trả lời tốt và đầy đủ.
Cbhihe

1
+1 từ tôi. Chỉ cần lưu ý một chi tiết khi tôi đang chạy cái này trên RHEL: ký tự đại diện không hoạt động trên đường dẫn. Tôi đã phải đặt nó lên -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis

1
@SteliosAdamantidis oh wow, tôi hoàn toàn bỏ lỡ điều đó! Có, phiên bản gốc sẽ không hoạt động kể từ khi tôi đã trích dẫn 'securityuser*'. Ký tự đại diện phải được mở rộng bằng vỏ chứ không phải bằng find, vì vậy nó phải là securityuser*(không có dấu ngoặc kép). Xem câu trả lời cập nhật. Cảm ơn vì đã chỉ ra, Stelio, tôi không thể tin rằng không ai chú ý trước đây! Ti vlakas!
terdon

4

theo tôi kiến ​​thức của tôi:

thử findlệnh như thế này:

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm

Cảm ơn về câu trả lời của bạn. Liệu ./dirc/* có nghĩa là: ./home/securityfolder1/* hoặc điều này có sai không?
Jacco van de Wijgaart

Tôi vừa thử nó trong hộp ảo của mình find /home/jacco/ -mtime +1 -type f -deletevà nó dường như hoạt động. Làm thế nào tôi có thể tự động hóa điều này?
Jacco van de Wijgaart

tạo một tệp script và kích hoạt lệnh này bằng script nếu nó hoạt động hơn là chạy tệp script của bạn trong quá trình khởi động.
Maulik Patel

Tôi giống như supernoob ngay tại đây vì đây là một phần của việc tạo tập lệnh, điều này có nghĩa là một tập tin #!/bin/bashvà mã theo đó? hoặc tôi thực sự ngu ngốc ở đây?
Jacco van de Wijgaart

2
@Melebius không, đường dẫn tha không nên được trích dẫn, đặc biệt là khi chứa các ký tự toàn cầu. Bạn muốn nó được mở rộng bởi trình bao và trích dẫn sẽ chặn điều đó. Hãy thử, ví dụ : find '/u*' -name local. Chỉ thị như thế -name "foo*"nên được trích dẫn khi chứa các ký tự toàn cầu.
terdon
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.