Çok sayıda alt klasörü olan bir klasörü nasıl hızlı bir şekilde silebilirim?


15

266778 alt klasörlü bir klasörüm var. Nasıl silebilirim?

denedim

cd ~/.local/share/Trash/
sudo rm -rf *

ama çok zaman alıyor. 1 dakika 25 saniye gerçek zamanlı ve 0.072 saniye kullanıcı süresinden sonra sadece 2500 klasör sildi. Bu şekilde, bu klasörün silinmesi iki saatten fazla sürer.

Bu klasörü silmenin daha hızlı bir yolu var mı? Kullanıcı zamanı ile gerçek zaman arasında neden bu kadar büyük bir fark var?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Linux 2.6.32 (Ubuntu 10.04.4 LTS) kullanıyorum.


Ben sadece bu sorunu googled ve bazı insanlar rsync bir "çok dosya silme" aracı olarak oldukça verimli kullanılabileceğini keşfettiler görünüyor. Gerçekten daha hızlı olup olmadığı değerlendirmek size kalmış.
Johan

2
Değerine göre: birçok klasörü / dosyayı silerken performans, dosya sistemine oldukça bağlıdır. Deneyimlerime göre ext3 (yavaş) ve XFS (hızlı) üzerindeki milyonlarca küçük dosyayı silerken fark saatler olabilir.
pdo

Sık sık bu durumunuz varsa ve btrfs gibi bir dosya sistemi kullanarak ve bir alt hacim kullanarak önceden planlayabiliyorsanız, yalnızca bu alt hacmi dökerek işleri hızlandırabilirsiniz.
PlazmaHH

İşte cevabı burada bulabilirsiniz. Perl biri en hızlısıdır. unix.stackexchange.com/questions/37329/…
SDsolar

Yanıtlar:


17

"Find" sürümünüz -delete alt komutunu uygularsa,

find directory -delete

Bu durumda:

find ~/.local/share/Trash/ -delete

Rm gibi bazı komutlar çalışmalarının çoğunu çekirdekte gerçekleştirir. Dosya sistemi rutinlerinde kesin olmak gerekirse. Sistem çağrılarını gerçekleştirmek için harcanan zaman bu şekilde hesaba katılır, bu nedenle "rm" komutunuz uzun süre çalışırken kullanıcı topraklarında fazla iş yapmaz - sistem çağrıları işin çoğunu gerçekleştirir.


+1; Bu da üst dizin siler ve OP sadece Çöp klasörünün içeriğini değil klasörün kendisini silmek istediğinden şüpheleniyorum
don_crissti

1
@ don_crissti: iyi açıklama. eğer OP ~ / .local / share / Trash altında sadece silme subdirs istedi (ve 1 seviyesinde dosyaları), ardından: find ~/.local/share/Trash/*/ -delete (tabii ki, bu irade bu Çöp Kutusu hiçbirinde de silme dosyaları (ve dirs) / * / alt dizinler de)
Olivier Dulac

2
time
Martin Thoma

3
find directory -deleteGerçekten daha hızlı mı rm -rf directory? Sonuçta, aynı işi yapıyorlar ve bunu yapmanın iki yolu yok.
Gilles 'SO- kötülük olmayı bırak'

1
@Johan find gerçekten hızlı. Sebebini bulma şansınız oldu mu?
Harshdeep

20

Hızlı tanımınıza bağlıdır . Buradaki yanıtlar, dizinleri dosya sisteminden gerçekten kaldırmak için iyi bir çözüm sunar, ancak gerçekten ihtiyacınız olan dizin adını olabildiğince hızlı boşaltmaksa , aynı dosya sisteminde bir yeniden adlandırma anlıktır:

{ mv directory directory.gone && rm -rf directory.gone; } &

Teknik olarak bu, gerçek silme işlemini hızlandırmadığım için hile yapıyor, ancak pratik olarak çok yararlı: Bu numarayı her zaman kullanıyorum, bu yüzden yavaş silme işlemlerini beklemek zorunda değilim.


Harika. Bunu her zaman yapmak için kullanım durumunuz nedir? Çok yaparsanız, biriktirme, birden fazla 'directory.gone's alma ve başarısız olma tehlikesi yok mu? '$$' veya '% (tarih ...)' gibi bir sonek kullandığınızı
varsayıyorum

1
Gerekirse, muhtemelen aynı dosya sisteminde kalmasını sağlayan argümanlar ile mktemp kullanabilirsiniz. Ama şu anda belirli bir örneğim olduğunu söyleyemem.
kojiro

kojiro evet teşekkürler, mktemphatırlamaya çalıştığım şey bu ...
smci

1

rm -rf directoryveya rm -rf *yerel rmuygulamanız bozulmadığı sürece en hızlı yöntemdir .

Kullanmanın findhiçbir avantajı yoktur.

Bunun hızlı mı yoksa yavaş mı olduğu esas olarak dosya sistemine ve işletim sistemi uygulamasına bağlıdır. Yani soru uygunsuz gibi görünüyor.

Solaris'teki UFS ve ZFS'nin bu tür bir görevle çok hızlı olduğu bilinmektedir, çünkü her iki dosya sistemi uygulaması , ilgili nesne toplamda daha fazla zaman alacak olsa bile unlink()ve rmdir()çağrıların hızlı geri dönmesine neden olan gecikmiş arka plan silme kodunu içerir .

Çekirdekteki gecikmeli arka plan silme ile dizin güncellemeleri de hızlı bir şekilde yapılabilir ve bu, tüm işlemi hızlandırmaya yardımcı olur.


Kişi bunu düşündüğü için affedilebilir olsa da, bu cevabın açıkladığı gibi bu aslında doğru değildir .
Hitechcomputergeek

0

Bu sadece kısmi bir cevaptır, komutun döndürdüğü üç değere ışık tutar; time(1)Manpage'den alıntı :

(i) çağırma ve sonlandırma arasında geçen gerçek zamanı, (ii) kullanım CPU süresi (toplamı tms_utimeve tms_cutimeiçinde değerleri struct tmsile döndürülür times(2)), ve (iii) sistem CPU süresi (toplamı tms_stimeve tms_cstimebir değerler struct tmstarafından döndürülen times(2)). "

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.