Xóa tất cả các tệp được tạo trước một ngày nhất định


26

Tôi có một thư mục chứa một số lượng lớn các tệp (như nhật ký cho mỗi ngày trong năm). Tôi muốn xóa tất cả các tệp được tạo trước khi nói 22/11. Làm thế nào tôi có thể đạt được điều đó? Tôi phải sử dụng findsau đó thực hiện -rm? Tôi đang sử dụng ksh.


1
Thông báo trước thông thường là các hệ thống tệp Unix thường không chứa bản ghi khi tệp được tạo - chỉ những lần inode và nội dung được sửa đổi lần cuối mới khả dụng.
Toby Speight

Câu trả lời:


35

Sử dụng findvẫn là cách xóa tập tin ưa thích. Xem http://mywiki.wooledge.org/UsingFind để biết thêm.

Một cách để làm điều này là tạo một tệp có dấu thời gian trong đó. ví dụ

touch -t 201311220000 /tmp/timestamp

Bây giờ xóa các tệp GNU find(giả sử trong thư mục hiện tại) khớp với dấu thời gian, ví dụ:

find . -type f ! -newer /tmp/timestamp -delete  

hoặc không tìm thấy GNU

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
Cái này thì sao ? Nó có hoạt động không? tìm -type f -mtime +5 -exec rm -f {} \;
dùng1058398

1
@ user1058398 Điều đó sẽ xóa các tệp cũ hơn 5 ngày kể từ bây giờ.
Valentin Bajrami

Nó cũng xóa thư mục cùng với các tập tin? @ val0x00ff
alper

1
@Avatar không vì chỉ type -fgiới hạn hành động cho các tệp.
Valentin Bajrami

22

Với GNU hoặc một số BSD find:

find . ! -newermt 2013-11-22 ! -type d -delete

Lưu ý rằng nó kiểm tra thời gian sửa đổi cuối cùng của các tập tin. Trên một số BSD, bạn có thể sử dụng -newerBtthay thế -newermtđể kiểm tra thời gian sinh inode của tệp nếu có.


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

thí dụ:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

Trong trường hợp này, nó sẽ xóa tất cả các tệp bắt đầu với "ORA_XEO" trong hơn 15 ngày.


Mặc dù tốt hơn nên xem nó bằng rm -rflệnh, lệnh đầu tiên sẽ xóa mọi thứ có trong bất kỳ thư mục nào cũ hơn 15 ngày đó. (Ngoài ra, tại sao dấu ngoặc đơn xung quanh -name?)
ilkkachu

Bạn nói đúng, chúng tôi không cần đặt "(" ")".
calafate

nhưng nếu chúng ta muốn thêm một điều kiện thì nó có thể hữu ích. ví dụ: nếu chúng tôi muốn xóa tất cả các tệp kết thúc bằng ".jar" hoặc ".cp" và bắt đầu bằng "ex". example.jar- nó sẽ bị xóa example.cp- nó sẽ bị xóa example.tar- nó sẽ không bị xóa
calafate

trong trường hợp này chúng ta có thể sử dụng: find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
calafate

Điều đó sẽ xóa một số tệp khỏi <số ngày> thay vì tất cả các tệp cũ hơn <số ngày> trừ khi bạn chạy chính xác vào nửa đêm và kết thúc trong vòng một giây. Với GNU, findbạn nên sử dụng công cụ -daystartsửa đổi để ép buộc -mtimegiá trị đến nửa đêm.
roaima
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.