Yanıtlar:
Dizini kaldıramıyorsanız, her zaman find öğesini kullanabilirsiniz.
find . -maxdepth 1 -type f -exec rm -f {} \;
Bu, geçerli dizindeki tüm dosyaları ve yalnızca geçerli dizini (alt dizinleri değil) siler.
find dir/to/delete -delete
( rm
Silinecek dosya başına işlem üretmez ).
find dir/to/delete -type f -delete
bulmak. -maxdepth 1 tipi f -exec rm -f {} \;
sadece çok uzun sürer (dosya başına rm bir yürütme).
bu çok daha verimli:
bulmak. -maxdepth 1-tipi f -print0 | xargs -r0 rm -f
mümkün olduğu kadar çok rm argümanı olabildiğince, rm mümkün olduğunca çok dosya adı alır, daha sonra rm bir sonraki dosya adı yükü ile çalışır ... rm sadece 2 veya 3 kez denir.
ionice
önce eklemek rm
iyi bir fikirdir.
Her ikisi de sorunu çözecek. Üzerinden her tekniğin ilgili performans analizi vardır burada .
find . -name WHATEVER -exec rm -rf {} \;
veya
ls WHATEVER | xargs rm -rf
Sorun dizindeki everysingle öğesiyle bash genişletme "*" kaynaklanıyor. Her iki çözüm de sırayla her dosyada çalışır.
find . -print0 | xargs -0 rm
).
ls *
" ve " *
kabuk çok uzun olmaktan şikayetçi olduğunu argüman listesine" genişlemekte. Bunun ls .
yerine " " yapın (veya bir dizin düzeyi yukarı çıkın ve " ls [dirname]
" yapın).
Bunu bir seviye yedekleyerek yapabildim:
cd ..
Ve çalışıyor:
rm directory name -rf
Ve sonra dizini yeniden oluşturun.
Tüm bu bulma çağrıları çok güzel ama acelem olduğunda gereken isimlendirmeyi nadiren hatırlıyorum: Bunun yerine ls kullanıyorum. Birinin bahsettiği gibi, ls. ama ls -1'i aşağıdaki gibi tercih ederim:
ls -1 | xargs -n 100 rm -rf
-N xxx rakamının oynaması oldukça güvenlidir, çünkü maksimum değeri aşmak otomatik olarak düzeltilecektir (boyut-maks aşılırsa; bkz. -S) veya bir uygulama için args-max aşılırsa genellikle açık.
Sadece büyük bir dizindeki dosyaların bir alt kümesini silmek istediğinizde grep'in bu zincirin ortasına eklemek yararlı olduğunu ve herhangi bir nedenle bulmak istemediğinizi belirtmek gerekir.
Bu yanıt, ls, xargs vb. İçin Gnu çekirdek yardımcı programları kullandığınızı varsayar.
Sistemin yanıt vermesi gerektiğinde çok sayıda dosyayı silmeye yönelik bir sürüm.
Küçük gruplar halinde (varsayılan olarak 100 dosya) iş çıkararak ve diğer işlerin bitmesini bekleyerek çalışır.
Ext3'te tek bir dizinden yarım milyondan fazla dosyayı silmek için mükemmel bir şekilde çalıştı. Yüzdeyi küçük bir bonus olarak yazdırır
noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do
n=$((n+100));
sync;
echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
sleep 5;
done
"Bağımsız değişken çok uzun" veya "bellek ayıramıyor" hatalarını çözer
Bu oturum klasöründe 220.000 + dosyaları hile yaptı ....
Avantajı: dosyaları hemen kaldırmaya başlar
cd yolu / klasör /
ls -f | xargs rm -f -v
Kaldırılan dosyaların ekran görüntüsü için TIKLAYIN - (~ 15dk içindeki tüm dosyalar kaldırıldı)
-f ( ls'den sonra) önsözlemeyi durdurur
-v ( rm'den sonra) her dosyayı kaldırılıyor olarak görüntüler
-f ( rm'den sonra) yazma korumalı dosyalarda komut istemi olmadan zorlanır
İpucu: Dosyaları silmeye çalışırken otomatik olarak oluşturulmuş ek dosyaların eklenmesini önlemek için önce klasörü yeniden adlandırın (oturumdan oturuma_old) . Benim durumumda olduğu gibi otomatik olarak yoksa, orijinal dizini manuel olarak yeniden oluşturabilirsiniz