Làm cách nào để tìm và xóa các tệp cũ hơn ngày cụ thể trong unix?


38

Tôi đã có một thư mục để đăng nhập với 7 thư mục trong đó. Bảy thư mục đó cũng có các thư mục con trong đó và các thư mục con đó cũng có các thư mục con. Tôi muốn xóa tất cả các tệp cũ hơn 15 ngày trong tất cả các thư mục bao gồm các thư mục con mà không chạm vào cấu trúc thư mục, điều đó có nghĩa là chỉ các tệp.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Câu trả lời:


54

Bạn có thể bắt đầu bằng cách nói find /var/dtpdev/tmp/ -type f -mtime +15. Điều này sẽ tìm thấy tất cả các tập tin cũ hơn 15 ngày và in tên của họ. Tùy chọn, bạn có thể chỉ định -printở cuối lệnh, nhưng đó là hành động mặc định. Nên chạy lệnh trên trước để xem tập tin nào được chọn.

Sau khi bạn xác minh rằng findlệnh đang liệt kê các tệp mà bạn muốn xóa (và không có ai khác), bạn có thể thêm "hành động" để xóa các tệp. Các hành động điển hình để làm điều này là:

  1. -exec rm -f {} \;(hoặc, tương đương, -exec rm -f {} ';')
    Điều này sẽ chạy rm -ftrên mỗi tệp; ví dụ,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Điều này sẽ chạy rm -ftrên nhiều tệp cùng một lúc; ví dụ,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    vì vậy nó có thể nhanh hơn một chút so với tùy chọn 1. (Nó có thể cần chạy rm -fmột vài lần nếu bạn có hàng ngàn tệp.)

  3. -delete
    Điều này nói với findchính nó để xóa các tập tin, mà không cần chạy rm. Điều này có thể cực kỳ nhanh hơn các -execbiến thể, nhưng nó sẽ không hoạt động trên tất cả các hệ thống.

Vì vậy, nếu bạn sử dụng tùy chọn 2, toàn bộ lệnh sẽ là:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

Sử dụng -delete đơn giản hơn (cú pháp và không có tiến trình con nào sinh ra để xóa) nhưng có thể không hoạt động trên tất cả các hệ thống. rm -f {} + là tốt nhất, nó sẽ xóa các tệp theo lô nếu có đủ tệp quá nhiều cho một dòng lệnh. rm -f {} ';' sẽ đưa ra lệnh quá dài lỗi nếu có đủ tệp quá nhiều cho một dòng lệnh.
gaoithe

-1

Hoặc làm điều đó với một vòng lặp:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

Điều này sẽ không hoạt động với các tập tin có không gian trong đó.
Drav Sloan

Bạn có thể sử dụng một vòng lặp while thay vào đó sẽ chăm sóc các tệp có khoảng trắng. tìm / var / dtpdev / tmp / -type f -mtime +15 | trong khi đọc x; làm rm "$ x"; xong
David Okwii
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.