Bir dizini silmek için “rm -rf” den daha hızlı bir yol var mı?


Yanıtlar:


33

Dizin için inode'un bağlantısını kesmeyi deneyebilirsiniz, ancak bu sizi tamamen ortaya fsck çıkaracak bir sürü yetim dosya bırakacaktır .

rm olabildiğince iyi.


Birkaç kişi bazı şeylerin diğerlerinden daha hızlı olduğu ileri vakalardan bahsediyor. Fakat aynı şeylerin en iyi versiyonlarını karşılaştırdığımızdan emin olalım.

Bir dizini ve içindeki her şeyi silmek istiyorsanız, size şunu öneriyorum:

rm -rf path/to/directory

rmsilinecek dosyaları ve dizinleri dahili olarak listeler. Ve hepsi bu C derlenmiş . En hızlı olmasının iki sebebi bu.

Bu, sivri bir biçimde , kabuk düzeyinde genişleyecek ve bir sürü argüman iletecek rm -rf path/to/directory/*olan şey değildir . Sonra bunları ayrıştırmalı ve sonra herinden tekrarlamalıdır. Bu çok daha yavaş.rmrm

Karşılaştıran bir "kıyaslama" gibi find path/to/directory -exec {} \;saçma. Bu rmbulur dosya başına bir kez çalışır . Çok yavaş. Bulmak can xargs tarzı build ile argüman komutları -exec rm {} +ama genişleme kadar yavaş. Çekirdeğe -deleteyapılan dahili bir unlinkçağrı kullanan çağrı yapabilirsiniz (aynen rmolduğu gibi ), ancak bu ilk başta dosyalar için işe yarar.

Yani, tekrarlamak için, diski sıvı sıcak magmaya atmadığınız sürece rm, kraldır .


İlgili bir notta, farklı dosya sistemleri, nasıl yapılandırıldıkları nedeniyle farklı oranlardaki şeyleri siler. Düzenli olarak yapıyorsanız, bu dosyaları, silme işlemlerini oldukça hızlı bir şekilde işleme eğiliminde olan XFS'de biçimlendirilmiş bir bölümde saklamak isteyebilirsiniz.

Veya daha hızlı bir disk kullanın. Tonlarca RAM'iniz varsa, /dev/shm(RAM diski) kullanmak bir fikir olabilir.


Aslında unlinksistem çağrısını dizinlerde kullanamazsınız (bir EISDIRhata alırsınız ), böylece ilk seçenek mümkün olmaz.
James Henstridge, 22.03

Mv to / tmp daha hızlı olur mu? Görünüşe göre mv de çok zaman alıyor.
Mohammad Moghimi

@MohammadMoghimi: mvFarklı dosya sistemleri / bölümleri araçları arasında ing bir cpbir takip rm.
enzotib

3
@enzotib Ancak, /tmpaynı dosya sisteminde ise, merak ediyorum mvve yeniden başlatma daha hızlı olur mu? Zaten /tmpkullanarak temizlendi eğer emin değilim rm.
Sparhawk

1
rsyncBu kriter davasında daha hızlı rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/…
schmijos

11

Bazen, find $DIR_TO_DELETE -type f -deletedaha hızlıdır rm -rf.

Ayrıca denemek isteyebilirsiniz mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE.

Eğer bütün bir bölümünün içeriğini silmek gerekiyorsa Son olarak, en hızlı muhtemelen olacak umount, mkfsve yeniden mount.


1
değil type -fbir dosya değil, bir dizin belirtmek için? ayrıca, ekleme -print, dosyaları silinirken gösterir.
leetbacoon

8

Boş alana ihtiyacınız yoksa, en hızlı yol silinmeyi geciktirmek ve arka planda bunu yapmaktır:

  • mkdir .delete_me
  • mv büyük dizini-i-istiyorum-gitti.

Ardından arka planda sessiz bir zamanda düşük I / O proiority yapan bir crontab'a sahip olun:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

Notlar:

  • crontab'daki ekoyu çıkarmadan önce çıktınızı kontrol edin!
  • .delete_me dizini aynı dosya sisteminde olmalı - herkes için açık olmasa bile.

Güncelleme: Paralel olarak birden fazla rm çalıştırmak için temiz bir numara buldum - eğer büyük bir disk diziniz varsa bu yardımcı olacaktır:

ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • Derinlik ilk geçiş yapmak için -depth.

  • -maxdepth, dizinde gezinmenin derinliğini sınırlamak için tekil dosyaları dinlememize son verir.

  • Dosya adlarındaki boşlukları işlemek için -d \ n.

  • -P ve -n paralellik derecesini ele alır (manpage kontrol edin).

ref: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

Güncelleme 2 (2018): Ubuntu 18.04 ile gelen ZFS ile her şey için kullanıyorum ve herhangi bir büyük proje için yeni bir veri kümesi oluşturacağım . Önceden plan yapar ve bunu önceden yaparsanız, bittiğinde bir dosya sistemini "zfs imhası" yapabilirsiniz. ;-)

Yerel olarak Ubuntu'yu ZFS'ye yüklemek için zfsonlinux wiki'den gelen talimatları kullandım: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS


2
Bu son komutun yerine kullanın find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. -depthSeçenek söyler findİlk liste çocuklara.
muru

2

Bence bu konu, çok büyük bir dizini ve tüm içeriğini kaldırmanın mükemmel bir yolunun bulunmadığını düşünüyorum. Bağlantısızlığı anlayan gerçek bir indeksli dosyalama sistemi var. Bir güven olmalı.

Mesela ben bir golf sahası için çalışan zoneminder var. Bir günde yakaladığı devasa veri miktarını (12 kamera beslemesi) ele geçirmek için 1,5 TB'lık bir linux baskını yaptım, 120 GB'lik sürücüde nasıl çalıştığını. Uzun lafın kısası, yakalanan tüm veriler için klasörün depolanması yaklaşık 1.4 TB'dir. Temizlemek için çok

ZM’yi yeniden yüklemek ve 1.4 TB’lik eski kütüphaneyi temizlemek zor değil çünkü eski resimlerin silinmesi 1 - 2 gün sürebilir.

Gerçek dizine alınmış bir FS dizinin düşmesine izin verir ve altındaki verilerin öldüğünü ve verilerin sıfırlanmasının zaman ve bilgisayar kaynaklarımızın boşa harcandığını bilir. Silinen verileri sıfırlamak için bir seçenek olmalıdır. Ext4'te gerçek dünyada RM çok uzun sürüyor.

Cevap: Sürekli olarak tüm dosyaların bağlantısını kesmek, marjinal olarak daha hızlı olacaktır, ancak yine de FSCK'yı çalıştırmak için bir zaman ayırmanız gerekir.

Klasörlerinizin altındaki tüm dosyaların "bağlantısını kaldırabilecek" özyinelemeli "FOR" komutunu çalıştıran bir komut dosyası oluşturun, sonra temizlemek için tüm klasörleri rm veya rmdir. Uygun olduğunda, kalan veriyi sıfırlamak için FSCK'yi manuel olarak çalıştırın. Biraz tembel, üzgünüm yazmadı :).


0

Mevcut bir dizini silmek istiyorsanız yararlı olmasa da, bir dizini düzenli olarak temizlemeniz gereken dosyaları içeren bir dizinin olduğunu bildiğiniz takdirde, olası bir stratejinin dizini kendi dosya sistemine koymak olduğunu söyleyeceğim ( örneğin , bölüm). Sonra temizlemeniz gerektiğinde, sökünüz, a çalıştırınız mkfsve yeniden monte ediniz. Örneğin, OpenBSD bunun için/usr/obj bir sistem derlemesi sırasında birçok dosyanın oluşturulduğu ve bir sonraki derlemeden önce silinmesi gerektiği için bunu önermektedir.

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.