Birçok dosyaya sahip bir klasörüm var ve "rm -rf" nin tamamlanması çok zaman alıyor. Bir dizini ve içeriğini (subdir'ler, vb.) Kaldırmanın daha hızlı bir yolu var mı?
Birçok dosyaya sahip bir klasörüm var ve "rm -rf" nin tamamlanması çok zaman alıyor. Bir dizini ve içeriğini (subdir'ler, vb.) Kaldırmanın daha hızlı bir yolu var mı?
Yanıtlar:
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
rm
silinecek 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ş.rm
rm
Karşılaştıran bir "kıyaslama" gibi find path/to/directory -exec {} \;
saçma. Bu rm
bulur 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 -delete
yapılan dahili bir unlink
çağrı kullanan çağrı yapabilirsiniz (aynen rm
olduğ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.
unlink
sistem çağrısını dizinlerde kullanamazsınız (bir EISDIR
hata alırsınız ), böylece ilk seçenek mümkün olmaz.
mv
Farklı dosya sistemleri / bölümleri araçları arasında ing bir cp
bir takip rm
.
/tmp
aynı dosya sisteminde ise, merak ediyorum mv
ve yeniden başlatma daha hızlı olur mu? Zaten /tmp
kullanarak temizlendi eğer emin değilim rm
.
rsync
Bu kriter davasında daha hızlı rm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/…
Bazen, find $DIR_TO_DELETE -type f -delete
daha 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
, mkfs
ve yeniden mount
.
type -f
bir dosya değil, bir dizin belirtmek için? ayrıca, ekleme -print
, dosyaları silinirken gösterir.
Boş alana ihtiyacınız yoksa, en hızlı yol silinmeyi geciktirmek ve arka planda bunu yapmaktır:
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:
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
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. -depth
Seçenek söyler find
İlk liste çocuklara.
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ı :).
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 mkfs
ve 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.