Bagaimana menemukan dan menghapus file yang lebih tua dari hari-hari tertentu di unix?


38

Saya punya satu folder untuk log dengan 7 folder di dalamnya. Ketujuh folder tersebut juga memiliki subfolder di dalamnya dan subfolder itu juga memiliki subfolder. Saya ingin menghapus semua file yang lebih lama dari 15 hari di semua folder termasuk subfolder tanpa menyentuh struktur folder, itu berarti hanya file.

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

Jawaban:


54

Anda bisa mulai dengan mengatakan find /var/dtpdev/tmp/ -type f -mtime +15. Ini akan menemukan semua file yang lebih tua dari 15 hari dan mencetak nama mereka. Secara opsional, Anda dapat menentukan -printdi akhir perintah, tetapi itu adalah tindakan default. Dianjurkan untuk menjalankan perintah di atas terlebih dahulu, untuk melihat file apa yang dipilih.

Setelah Anda memverifikasi bahwa findperintah tersebut mencantumkan file yang ingin Anda hapus (dan tidak ada yang lain), Anda dapat menambahkan "tindakan" untuk menghapus file. Tindakan khas untuk melakukan ini adalah:

  1. -exec rm -f {} \;(atau, dengan kata lain, -exec rm -f {} ';')
    Ini akan berjalan rm -fpada setiap file; misalnya,

    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 {} +
    Ini akan berjalan rm -fpada banyak file sekaligus; misalnya,

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

    jadi mungkin sedikit lebih cepat daripada opsi 1. (Mungkin perlu dijalankan rm -fbeberapa kali jika Anda memiliki ribuan file.)

  3. -delete
    Ini memberitahu finddirinya sendiri untuk menghapus file, tanpa menjalankan rm. Ini mungkin jauh lebih cepat daripada -execvarian, tetapi tidak akan bekerja pada semua sistem.

Jadi, jika Anda menggunakan opsi 2, seluruh perintah akan menjadi:

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

Menggunakan -delete lebih sederhana (sintaks dan tidak ada proses anak yang muncul untuk menghapus) tetapi mungkin tidak bekerja pada semua sistem. rm -f {} + yang terbaik, itu akan menghapus file dalam batch jika ada cukup banyak file untuk satu baris perintah. rm -f {} ';' akan memberikan perintah terlalu lama kesalahan jika ada cukup banyak file untuk satu baris perintah.
gaoithe

-1

Atau lakukan dengan loop:

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

Ini tidak akan berfungsi dengan file dengan spasi di dalamnya.
Drav Sloan

Anda dapat menggunakan loop sementara sebagai gantinya yang harus menangani file dengan spasi. temukan / var / dtpdev / tmp / -type f -mtime +15 | saat membaca x; lakukan rm "$ x"; selesai
David Okwii
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.