“Bağımsız değişken listesi çok uzun” rapor ettiğinde bir dizindeki tüm dosyaları nasıl silebilirim


Yanıtlar:


11

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.


neredeyse mükemmel (yazıma da bakınız)
asdmin

2
Linux'ta "\;" yerine "+" kullanarak bunu daha da hızlı yapabilirsiniz. Bu bir seferde "rm" başına daha fazla dosya kaldırmak neden olur.
Thomas

5
Daha da hızlı: find dir/to/delete -delete( rmSilinecek dosya başına işlem üretmez ).
Morten Siebuhr

Morten: Dizinin kendisini silmek istediğinden hiç bahsetmedi, dedi onky dosyaları. find dir/to/delete -type f -delete
richo

21
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.


5
Birinin bulmanın nasıl çalıştığını bildiğini gördüğüme sevindim ... Ayrıca yeni gnu find'ın xargs gibi davranan -delete eylemi veya -exec komutu {} + ile düşünün. "Man find" ın Eylemler bölümüne bakın.
Kyle Brandt

-Exec cmd {} + hakkında bir şey bilmiyordum. Bu oldukça faydalı görünüyor. -Delete'den biraz daha genel :)
David Pashley

-delete iyi olabilir, ama ben şahsen çeşitli makinelerde kullanılabilecek komutları tercih ederim. Birlikte çalıştığım Solaris sistemleri daha eski, bu yüzden -delete onlar üzerinde çalışmayacak
asdmin

2
Bilgisayarın aynı anda başkaları tarafından kullanılması durumunda, daha ioniceönce eklemek rmiyi bir fikirdir.
Hubert Kario

6

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.


2
Bulma çözümü birçok dosyada daha yavaştır çünkü her bir dosya için rm komutunu çağırır. Xargs çözümü daha hızlıdır, ancak yalnızca dosya adları boşluk içermediğinde çalışır (aksi takdirde GNU bul ve kullanmanız gerekir find . -print0 | xargs -0 rm).
robcast

"find. -name WHATEVER -print0 | xargs -0 rm -rf" daha verimli olacaktır. find her dosya için bir rm çatalı yapar, burada xargs onu en aza indirir. İçinde boşluk bulunan dosyalarla başa çıkmak için -print0 ve -0'a ihtiyacınız vardır. Büyük olasılıkla, bulurken -depth öğesini de kullanmak istersiniz, bu nedenle önce derinlik araması yapar.
David Pashley

Ls komutu, "argüman listesi çok uzun" döndürdüğü için çalışmaz
Brent

2
Sen "yapıyoruz 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).
James Sneeringer

ikinci komut satırı (ls WHATEVER | xargs rm -rf), soru işe yaramazsa aynı nedenden dolayı çalışmaz: WHATEVER kabuk tarafından aşan bir uzunluğa
bırakılır

3

Bunu bir seviye yedekleyerek yapabildim:

cd ..

Ve çalışıyor:

rm directory name -rf

Ve sonra dizini yeniden oluşturun.


1
yalnızca dir adresine kalıcı olarak sahip olmanız gerekmiyorsa çalışır ve tüm dosyalar ve dizinler yinelemeli olarak silinir. hayatımdaki vakaların çoğu, bu şekilde işe yaramazdı.
asdmin

2

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.


Bu "ls" çalışmak için çok büyük bir dizin ile çalışır mı? (aynı hata - tartışma listesi çok uzun)
Brent

Evet Brent: ls'yi çağırırken bir filespec kullanmadığınızdan emin olun. Yukarıda gösterildiği gibi sadece -1'i (tire One) kullanın. Ve yukarıda açıklandığı gibi, dosya listesini eşleştirmeniz gerekiyorsa ls'den sonra grep kullanın. Ls ile herhangi bir joker karakter kullanmadığınızdan emin olduktan sonra "çok uzun" hatası alıyorsanız, belki xargs şikayet ediyor. 'Xargs -n 100' yerine 'xargs -n 5' kullanın ve biraz daha yavaşsa kesinlikle güvende olmalısınız.
rixtertech

1

-exec +Hangisini rm'yi mümkün olduğunca az kez çalıştırmaya çalışacağını bulmak için seçeneği kullanabilirsiniz , bu daha hızlı olabilir.

find . -type f -exec rm '{}' +

0

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

0

"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


Cevabınızda öncekilerden eksik olan yeni ne var?
user2233709
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.