Tập lệnh Bash để xóa các tệp cũ hơn x ngày với các thư mục con


37

Tôi đang cố gắng xóa một tấn tệp cũ hơn x ngày.

Bây giờ tôi có một kịch bản để làm điều đó

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

Nhưng điều này cũng sẽ xóa các thư mục con. Có rất nhiều thư mục nhưng tôi muốn giữ chúng và xóa các tệp cũ hơn 10 ngày trong các thư mục đã nói.

Có cách nào để làm việc này không?

Câu trả lời:


50

type tùy chọn lọc kết quả

findchấp nhận typetùy chọn để chọn, ví dụ, chỉ các tệp.

find /path/to/files -type f -mtime +10 -delete

Rời khỏi -deleteđể hiển thị những gì nó sẽ xóa và sau khi bạn xác minh điều đó, hãy tiếp tục và chạy lệnh đầy đủ.

Điều đó sẽ chỉ chạy trên các tập tin, không phải thư mục. Sử dụng -type dcho các thư mục liệt kê ngược, chỉ phù hợp với đối số của bạn.


Tùy chọn bổ sung

Bạn có thể muốn đọc man find, vì có một số tùy chọn khác bạn có thể cần trong tương lai. Ví dụ: -maxdepthsẽ cho phép bạn chỉ giới hạn các mục được tìm thấy ở một độ sâu cụ thể, ví dụ: -maxdepth 0sẽ không tái diễn vào các thư mục con.

Một số nhận xét

  • Tôi tự hỏi làm thế nào lệnh sẽ xóa một thư mục, vì bạn không thể chỉ xóa một thư mục rm. Bạn sẽ cần rm -rđiều đó.

  • Ngoài ra, /path/to/files*là khó hiểu. Ý của bạn là /path/to/files/hoặc bạn đang mong đợi ký tự đại diện sẽ mở rộng thành một số tên tệp và thư mục?

  • Đặt {}dấu ngoặc đơn, nghĩa là '{}'để tránh tên tệp / thư mục được thay thế được giải thích bởi shell, giống như chúng ta bảo vệ dấu chấm phẩy bằng dấu gạch chéo ngược.


Vâng, có rất nhiều thư mục trong / path / to / files / thực sự tôi muốn chạy mtime +10 -exec rm cho mỗi thư mục đó nhưng vẫn giữ các thư mục đó, về cơ bản tôi muốn đạt được là xóa tất cả tập tin cũ hơn 10 ngày và giữ tất cả các thư mục. Tôi là một người mới xin lỗi vì sự mới mẻ đó :)
JoyIan Yee-Hernandez

Vâng, bạn đi đây :) Chỉ cần làm một find /path/to/files* -type f -mtime +10và xem những gì nó sẽ xuất ra.
slhck

Yup, khi nghi ngờ, đừng làm -exec, chỉ cần xem những gì nó tìm thấy đầu tiên.
Cướp

2
@ JoyIanYee-Hernandez Bạn cũng có thể sử dụng -deleteđối số để findxóa tất cả các tệp và thư mục, chỉ sau khi trống. Nó ngụ ý -depth, tức là tìm kiếm theo chiều sâu.
Daniel Beck

1
@Kreker Sau đó, bạn cần thêm -mindepth 1để loại trừ thư mục cha.
slhck

5

Như trong các câu trả lời trước (+1 cho cả hai), mẹo là sử dụng -type fvị ngữ.

Lưu ý, thay vì -exec rm '{}'bạn cũng có thể sử dụng -deletevị ngữ. Nhưng đừng làm vậy. Trước tiên, -exec rm '{}'bạn có thể (và nên) làm -exec echo rm '{}'để xác minh rằng đây thực sự là những gì bạn muốn. Sau đó chạy lại lệnh mà không có echo.

Sử dụng -deletenhanh hơn (không có thêm fork()execve()cho mỗi tệp), nhưng điều này có rủi ro vì -deletehoạt động cũng như một điều kiện, vì vậy:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

nhưng nếu bạn CHỈ trao đổi đối số:

# delete ALL files
find . -type f -name '*.tmp' -delete

Nếu bạn cần findrmđể làm việc nhanh hơn cho hàng tấn tệp, hãy xem find ... | xargs ... rmthành ngữ UNIX.


4
Tôi nghĩ rằng hai ví dụ cuối cùng của bạn giống hệt nhau, có thể muốn sửa nó!
slhck

1

Bạn có thể dễ dàng làm điều này với lệnh find

$ find -type f

Mà giới hạn kết quả là của loại tệp


1

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


0

Để tăng tốc độ sử dụng lệnh '+'thay vì\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Điều này sẽ rmchỉ chạy một lần vào cuối thay vì mỗi lần tìm thấy một tập tin.
( rmcó thể được chạy nhiều lần nếu bạn thực sự có rất nhiều tệp vì giới hạn độ dài dòng lệnh, nhưng điều này vẫn nhanh như sử dụng -delete)


0

rm -f find /path/to/files -type file -mtime -5

Thao tác này sẽ xóa các tệp được sửa đổi trong vòng 5 ngày

rm -f find /path/to/files -type file -mtime +5

Thao tác này sẽ xóa các tệp được sửa đổi trước 5 ngày

Sử dụng `trước khi tìm và ở cuối sau 5.

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.