Shell script để xóa các thư mục cũ hơn n ngày


165

Tôi có các thư mục có tên là:

2012-12-12
2012-10-12
2012-08-08

Làm cách nào để xóa các thư mục cũ hơn 10 ngày với tập lệnh bash shell?


1
Để họ trần bất kỳ mối quan hệ về thời gian sáng tạo / sửa đổi thực tế của họ? Bởi vì findcó thể làm điều đó mà không cần nhìn vào cái tên đó ...
Wrikken

họ cũng nên có thời gian sáng tạo / sửa đổi đối với họ
bobsr

4
Bạn có ý nghĩa gì bởi "già hơn"? Bạn đang đề cập đến thời gian thư mục được tạo, thời gian nội dung của nó được thay đổi lần cuối, hay cái gì khác? Hãy cẩn thận với một số câu trả lời dưới đây; ctimelà thời gian thay đổi inode. Đối với một thư mục, nó thay đổi khi các tập tin được thêm hoặc xóa khỏi thư mục.
ajk

Câu trả lời:


390

Điều này sẽ làm điều đó đệ quy cho bạn:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

Giải trình:

  • find: lệnh unix để tìm tệp / thư mục / liên kết, v.v.
  • /path/to/base/dir: thư mục để bắt đầu tìm kiếm của bạn trong.
  • -type d: chỉ tìm thư mục
  • -ctime +10: chỉ xem xét những người có thời gian sửa đổi cũ hơn 10 ngày
  • -exec ... \;: cho mỗi kết quả như vậy được tìm thấy, hãy thực hiện lệnh sau trong ...
  • rm -rf {}: đệ quy lực lượng loại bỏ thư mục; các {}phần là nơi mà các kết quả tìm được thay ra từ phần trước.

Ngoài ra, sử dụng:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

Đó là một chút hiệu quả hơn, bởi vì nó lên tới:

rm -rf dir1 dir2 dir3 ...

như trái ngược với:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

như trong -execphương pháp.


Với các phiên bản hiện đại find, bạn có thể thay thế ;bằng +và nó sẽ thực hiện tương đương với xargscuộc gọi cho bạn, chuyển càng nhiều tệp sẽ phù hợp với mỗi lệnh gọi hệ thống exec:

find . -type d -ctime +10 -exec rm -rf {} +

12
-mtimetốt hơn cho tôi vì nó kiểm tra thay đổi nội dung thay vì thay đổi quyền, nếu không thì điều này là hoàn hảo.
quickshiftin

7
tôi nghĩ rằng điều này cũng sẽ xóa chính thư mục cơ sở
Hoặc Gal

3
@OrGal bạn hoàn toàn chính xác. Để ngăn chặn điều này, chỉ cần sử dụng : find /path/to/base/dir/*.
zloynemec

11
bạn có thể sử dụng -maxdepth 1 để bỏ qua nội dung của các thư mục
Sam

7
Cách tiếp cận hiệu quả hơn có thể phản tác dụng nếu bạn có quá nhiều thư mục cần xóa: stackoverflow.com/questions/11289551/ . Vì lý do tương tự, để tránh xóa thư mục cơ sở, tốt hơn là sử dụng -mindepth 1(chứ không phải /path/to/folder/*).
Ohad Schneider

41

Nếu bạn muốn xóa tất cả các thư mục con bên dưới /path/to/base, ví dụ

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

nhưng bạn không muốn xóa root /path/to/base, bạn phải thêm -mindepth 1-maxdepth 1các tùy chọn, sẽ chỉ truy cập các thư mục con bên dưới/path/to/base

-mindepth 1không bao gồm root /path/to/basetừ các trận đấu

-maxdepth 1sẽ chỉ phù hợp với các thư mục con ngay dưới /path/to/basenhư /path/to/base/dir1, /path/to/base/dir2/path/to/base/dir3nhưng nó sẽ không danh sách các thư mục con trong số này một cách đệ quy. Vì vậy, các thư mục con mẫu này sẽ không được liệt kê:

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1

và kể từ đó trở đi.

Vì vậy, để xóa tất cả các thư mục con dưới /path/to/base10 ngày;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf

19

findhỗ trợ -deletehoạt động, vì vậy:

find /base/dir/* -ctime +10 -delete;

Tôi nghĩ rằng có một lưu ý rằng các tệp cũng cần phải cũ hơn 10 ngày. Chưa thử, ai đó có thể xác nhận trong các bình luận.

Giải pháp được bình chọn nhiều nhất ở đây còn thiếu -maxdepth 0vì vậy nó sẽ gọi rm -rfcho mọi thư mục con, sau khi xóa nó. Điều đó không có ý nghĩa, vì vậy tôi đề nghị:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;

Các -deletegiải pháp trên không sử dụng -maxdepth 0findsẽ phàn nàn các dir là không có sản phẩm nào. Thay vào đó, nó ngụ ý -depthvà xóa từ dưới lên.


Tôi có thể xác nhận -deletehoạt động, nhưng như bạn nói bạn chỉ có thể sử dụng nó để xóa các thư mục trống, giống như rmdir.
CTodea

3

Tôi đã đấu tranh để có được quyền này bằng cách sử dụng các tập lệnh được cung cấp ở trên và một số tập lệnh khác, đặc biệt là khi tên tập tin và thư mục có dòng mới hoặc dấu cách.

Cuối cùng vấp phải tmpreaper và nó đã hoạt động khá tốt cho chúng tôi cho đến nay.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Liên kết nguồn gốc

Có các tính năng như kiểm tra, kiểm tra các thư mục đệ quy và liệt kê chúng. Khả năng xóa liên kết tượng trưng, ​​tệp hoặc thư mục và cả chế độ bảo vệ cho một mẫu nhất định trong khi xóa


2

HOẶC LÀ

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

Cập nhật, phiên bản nhanh hơn của nó:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

2
Điều này có thể dễ dàng vượt quá độ dài dòng lệnh tối đa. Xem xargs --show-limits.
Michael Krupp

2
Cũng sẽ không hoạt động nếu có tên tệp chứa dấu cách hoặc ký tự shell đặc biệt khác.
Martin Tournoij

@Carpetsmoker Không -print0/ -0chăm sóc các nhân vật vỏ đặc biệt, hay không?
mở

Bạn đúng rằng xargsphiên bản sẽ @mpen, nhưng dòng đầu tiên sẽ không.
Martin Tournoij
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.