Menghapus file yang lebih lama dari 7 hari

79

Saya menulis perintah di bawah ini untuk menghapus semua file yang lebih lama dari 7 hari, tetapi tidak berfungsi:

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

Bagaimana saya bisa menghapus file-file ini?

Malihe Pakyari
sumber
5
Harus ada ruang antara namedan '*.gz'.
Jos

Jawaban:

136

Seperti @ Jo menunjukkan Anda melewatkan ruang antara namedan '*.gz'; juga untuk mempercepat perintah penggunaan -type fpilihan untuk menjalankan perintah pada f iles saja.

Jadi perintah tetapnya adalah:

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

Penjelasan:

  • find: perintah unix untuk mencari f iles / d irectories / l tinta dan lain-lain
  • /path/to/: direktori untuk memulai pencarian Anda.
  • -type f: hanya menemukan file.
  • -name '*.gz': daftar file yang diakhiri dengan .gz.
  • -mtime +7: hanya mempertimbangkan yang dengan waktu modifikasi lebih dari 7 hari.
  • -execdir ... \;: untuk setiap hasil yang ditemukan, lakukan perintah berikut di ....
  • rm -- '{}': hapus file; yang {}bagian mana hasil find akan diganti menjadi dari bagian sebelumnya. --berarti parameter perintah akhir menghindari kesalahan prompt untuk file-file yang dimulai dengan tanda hubung .

Atau, gunakan:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

Dari manusia menemukan :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

Yang sedikit lebih efisien, karena berjumlah:

rm file1 file2 file3 ...

sebagai lawan:

rm file1; rm file2; rm file3; ...

seperti pada -execmetode.


Sebuah alternatif dan juga lebih cepat perintah menggunakan exec ini +terminator bukan\; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

Perintah ini akan berjalan rmhanya sekali di akhir daripada setiap kali file ditemukan dan perintah ini hampir secepat menggunakan -deleteopsi seperti berikut di modern find:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete
αғsнιη
sumber
3
Mengapa saya tidak langsung -deletepada akhirnya? Mengapa mengacaukan dengan +atau \;?
rain01
3
@ rain01 plz baca unix.stackexchange.com/q/167823/72456
αғsнιη
2

Hati-hati menghapus file dengan find. Jalankan perintah dengan -l untuk memeriksa apa yang Anda hapus

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Kemudian tarik perintah dari histori dan tambahkan-exec rm {} \;

Batasi kerusakan yang ditemukan oleh perintah find. Jika Anda ingin menghapus file hanya dari satu direktori, -maxdepth 1cegah cari dari menelusuri subdirektori atau dari mencari sistem lengkap jika Anda salah ketik /media/bkfolder /.

Batas lain yang saya tambahkan adalah argumen nama yang lebih spesifik seperti -name 'wncw*.gz', menambahkan waktu yang lebih baru -mtime -31, dan mengutip direktori yang dicari. Ini sangat penting jika Anda mengotomatiskan pembersihan.

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

zeke
sumber