30 günden daha eski dosyaları zarif bir şekilde silme


8

En az 15000 dosyalık bir önbellek klasörüm var.

Bunu denedim:

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

Ancak bu, sunucumun yükünü gökyüzüne uçurdu!

Herhangi var mı hızlı / daha iyi çözüm?

Veya bu komutun hızını veya yinelemelerini sınırlayabilir miyim ?


1
Eğer cache*çok sayıda dosya için genişler, gibi bir şey denemek isteyebilirsiniz find . -name 'cache*' -mtime +30 -exec rm {} \;yerine.
Jaap Eldering,

Yanıtlar:


9

tmpwatchBu şeyler için kullanmayı severim , bu dosyanın son değiştirildiği zamandır. Çok basit ve birçok durumda iyi çalışıyor:

tmpwatch -m 720 /path/to/cache

Ubuntu için tmpreaperbunun yerine kontrol edin .

Dosyaya en son ne zaman erişildiğini kontrol etmek istiyorsanız, aşağıdakileri kullanın:

tmpwatch -a 720 /path/to/cache

Nompime ile monte edilmiş dosya sistemlerinde tmpwatch -a komutunu kullanamazsınız. -m hala kullanabilirsiniz


Kullanıyorum Ubuntu 10.04.2 LTSve bu komut mevcut değil ..
Kristian

2
@Kristian tmpreaperBunun yerine denetleyin .
slhck

Noatime seçeneği ile monte edilmiş dosya sistemlerini yönetmek için bunları kullanırken herhangi bir tuzaklar?
AnonymousLurker

@AnonymousLurker Sizin için cevabı değiştirdim
WojonsTech

6

Kullanarak her dosya için yeni bir işlemin ortaya çıkmasını önleyebilirsiniz.

find cache* -mtime +30 -delete

3

Yukarıdakileri nice ile çalıştırmayı deneyin:

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

Bu şekilde, devasa yük yalnızca başka hiçbir şeyin çalışması gerekmiyorsa ortaya çıkar, aksi takdirde diğer işlemler öncelik kazanır (eğer hassaslıkları 19'dan az, yani maksimum).

-N seçeneğine argüman olacak böylece 39 kullanılan -20 ila 19. değişir varsayılan hoşluk eklenir unutmayın çok olursa olsun orada orijinal Ne incelik güzel.


2

Chiborg tarafından yorumlandığı gibi, yük bulunan her dosya için rm'nin başlatılmasından kaynaklanmaktadır. tmpwatchAlternatif olarak önerilen yerin cevabını fark ettim, eminim ki iyi sonuç verir. Ancak, gerekli değildir.

Bulunan dosyaları, aşağıdaki gibi argümanlar listesine eklemesini söylerseniz, bir kez yürütmek için verilen komutu çalıştırabilir:

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

Bu bazen işe yaramayabilir, çünkü argüman listesi kabuk tarafından izin verilen maksimum değerden (bayt cinsinden) büyüyebilir (getconf ARG_MAX). Bu, -L seçeneğiyle xargs ile çözülebilir.

bu örneği düşünün:

$ 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

Bu yüzden fazladan bir yazılım kurmanıza gerek yok, ihtiyacınız olan tek şey gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

Bazı d00d bulmak ve xargs'a -print0 ve -0 eklemenin faydalı olacağını düşünüyordu. Bu argümanlar komutlarını argümanları ayırmak için yeni bir satır (\ n) yerine null karakterini (\ 0) kullanır. Dosya adı içinde boşluklar veya yeni çizgiler olduğunda bu yardımcı olur.
Ярослав Рахматуллин

(1) Söylemene gerek yok \+; ova +yeterince iyi. (2) Bu “işe yaramaz, çünkü tartışma listesi genişleyebilir…”.  find  … -exec … {} +yapacak aynı şeyi xargsyapacak; komutu gerektiği kadar çalıştıracaktır. Eğer 15001 ila 20000 dosya varsa, örneğin (sizin örnekte olduğu gibi), findaday olacağını -exec'd programını ( rm) dört kez.
G-Man
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.