Dengan anggun menghapus file yang lebih lama dari 30 hari

8

Saya memiliki folder cache dengan minimal 15000 file.

Saya mencoba ini:

find cache* -mtime +30 -exec rm {} \;

Tapi ini membuat server saya memuat terbang ke langit!

Apakah ada solusi yang lebih cepat / lebih baik ?

Atau bisakah saya membatasi kecepatan atau iterasi dari perintah ini?

Kristian
sumber
1
Jika cache*mengembang ke banyak file, Anda mungkin ingin mencoba sesuatu seperti itu find . -name 'cache*' -mtime +30 -exec rm {} \;.
Jaap Eldering

Jawaban:

10

Saya suka menggunakan tmpwatchuntuk hal-hal ini, ini adalah terakhir kali file dimodifikasi. Ini sederhana dan berfungsi dengan baik dalam banyak kasus:

tmpwatch -m 720 /path/to/cache

Untuk Ubuntu, periksa tmpreapersaja.

Jika Anda ingin memeriksa kapan terakhir kali file diakses daripada Anda menggunakan yang berikut ini:

tmpwatch -a 720 /path/to/cache

Anda tidak dapat menggunakan tmpwatch -a pada sistem file yang dipasang dengan noatime. Anda masih bisa menggunakan -m

WojonsTech
sumber
Saya menggunakan Ubuntu 10.04.2 LTSdan perintah itu tidak ada ..
Kristian
2
@ Periksa Kristian sebagai tmpreapergantinya.
slhck
Adakah jebakan saat menggunakan ini untuk mengelola sistem file yang dipasang dengan opsi noatime?
AnonymousLurker
@AnonymousLurker Saya telah mengubah jawaban untuk Anda
WojonsTech
6

Anda dapat menghindari pemunculan proses baru untuk setiap file dengan menggunakan

find cache* -mtime +30 -delete
Chiborg
sumber
3

Coba jalankan di atas dengan baik:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

Dengan cara itu beban besar hanya akan muncul jika tidak ada lagi yang perlu dijalankan, jika tidak, proses lain akan didahulukan (jika kebaikannya lebih rendah dari 19 yaitu maksimum).

Perhatikan bahwa argumen ke opsi -n ditambahkan ke kebaikan standar yang bervariasi antara -20 dan 19. Saya menggunakan 39 sehingga akan sangat bagus terlepas dari apa kebaikan asli yang ada.

DanielFetchinson
sumber
2

Seperti dikomentari oleh chiborg, pemuatan ini karena memulai rm untuk setiap file yang ditemukan. Saya memperhatikan jawaban di mana tmpwatchdisarankan sebagai alternatif, yang saya yakin berfungsi dengan baik. Namun, itu tidak perlu.

Find dapat menjalankan perintah yang diberikan kepada exec sekali, jika Anda memintanya untuk mengakumulasikan file yang ditemukan ke dalam daftar argumen seperti:

find /path -name "*.moo" -exec rm {} \+

Ini kadang-kadang gagal berfungsi karena daftar argumen mungkin tumbuh lebih besar (dalam byte) daripada maksimum yang diizinkan oleh shell (getconf ARG_MAX). Ini dapat diselesaikan dengan xargs dengan opsi -L.

pertimbangkan contoh ini:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

Jadi tidak perlu menginstal perangkat lunak tambahan, yang Anda butuhkan adalah di gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 
Ярослав Рахматуллин
sumber
beberapa d00d berpikir akan berguna untuk menambahkan -print0 dan -0 untuk menemukan dan xargs. Argumen tersebut memaksa perintah mereka menggunakan null char (\ 0) alih-alih baris baru (\ n) untuk memisahkan argumen. Ini membantu ketika nama file memiliki spasi atau baris baru di dalamnya.
Ярослав Рахматуллин
(1) Anda tidak perlu mengatakan \+; polos +sudah cukup bagus. (2) Ini tidak akan "gagal berfungsi karena daftar argumen mungkin bertambah besar ...".  find  … -exec … {} +akan melakukan hal yang sama yang xargsakan dilakukan; itu akan menjalankan perintah sebanyak yang diperlukan. Misalnya (seperti pada contoh Anda), jika Anda memiliki antara 15001 dan 20.000 file, findakan menjalankan -execprogram ( rm) empat kali.
G-Man Mengatakan 'Reinstate Monica'