Pythontr

husonet | Tarih: 20.07.2014

Linux Dosya, Klasör Silme Komutları ve Hızlı Silme Yöntemleri

Dosyaları yada Klasörleri silmek için en hızlı yöntem hangisidir?

Linux, Debian dağıtımı ve türevleri baz alınarak aşağıdaki notları almış durumundayım.

Web sitesi ve özellikle index i ve hiti yüksek siteler yönetiyorsanız mutlaka 10 gb üzerinde dosya yada klasörleri silme ihtiyacınız oluşmuştur yada olacağına emin olabilirsiniz. Ben genelde Cache dosyaları üzerinde silme işlemi yapma ihtiyacı duyuyorum en son sildiğim klasörün boyutu 30 GB civarındaydı.


  • En hızlı yöntemi bulmak için silme işlemi için bildiğim bütün yöntemleri kullanacağım.
  • Linux üzerinde silme işlemini gerçekleştirmek için kullanabileceğimiz standart komutlar.

rm -f testdoysa

-f parametresi onay istemeden silme işlemini gerçekleştirecektir.


rm -rf testklasor

-rf paramresi onay istemenen hedef gösterilen klasörü, alt klasörlerini ve dosyaları silme işlemini gerçekleştirecektir.


rmdir testklasor

Sadece içi boş klasörleri silebilir.


Silme işlemini uygulayabileceğimiz bazı yöntemleri görelim

Örnek test klasörü içerisinde bulununa dosyarı sil.


# find /home/husonet/test -type f -exec rm {} \;

-type f parametresi file tipinde olanları işaret etmektedir.


Örnek test klasörü içerisinde 7 gün önce değiştirilmiş olanları bul ve sil.


# find /home/husonet/test -mtime +7 -exec rm {} \;

-mtime +7 parametresi zaman olarak 7 gün önceleri işaret eder.


Örnek test klasörü içerisindeki 7 mb ve büyük olan dosyaları bul ve sil.


# find /home/husonet/test -size +7M -exec rm {} \;

-size 7mb parametresi 7MB ve büyük dosyaları işaret eder.


Testlerimize başlamadan önce test klasörümüz üzerinde 1 milyon dosya oluşturalım
# for i in $(seq 1 1000000); do echo testing >> $i.txt; done

Artık silme işlemine başlayacağımız test dosyalarımız hazır en hızlı bu dosyaları nasıl silebiliriz testlerimize başlayabiliriz.


RM Komutu
huso@husonet:~/test$ time rm -f *

bash: /bin/rm: Argument list too long
real 0m8.906s
user 0m8.141s
sys 0m0.636s

Malesef rm tek başına bir milyon dosyayı silme işlemini gerçekleştiremedi.


Şimdi bu dosyaları find komutu içerisinde tek tek erişerek silme komutumuzu çalıştıralım.


huso@husonet:~/test$ time find ./ -type f -exec rm {} \;

real	387m3.872s
user 3m35.825s
sys 347m25.055s

Find komutunu delete seçeneği ile kullanalım bakalım sonucumuz ne olacak.
huso@husonet:~/test$ time find ./ -type f -delete

real	53m19.683s
user 0m0.568s
sys 0m20.021s

Sonuç Harika 53 dakikaya düştü.
Perl dili üzerinden silme işlemimizi deneyelim.
huso@husonet:~/test$ time perl -e 'for(<*>){((stat)[9]<(unlink))}'
real 1m7.411s
user 0m3.956s
sys 0m20.681s

Sonuç inanılmaz 1.000.000 dosya 1 dakika gibi kısa bir sürede silindi. Sanırım perl bu hususta en hızlı olacak gibi!


RSYNC

Boş Klasor: /home/huso/bostest
Boşaltılacak klasör: /home/huso/test


huso@husonet:~$ time rsync -a --delete bostest/ test/
real 1m2.108s
user 0m1.252s
sys 0m19.909s

Sonuç şaşırtıcı RSYNC silme işlemini çok başarılı bir şekilde halletti


Toparlayacak olursak

RM Komutu büyük sayıda dosyalarla uğraşma kabiliyeti malesef yok.
Find komutu -exec ile kullanıldığında 1.000.000 dosyayı 387 dakikada silebiliyor.
Find komutu -delete ile kullanıldığında 1.000.000 dosyayı 53 dakikada silebiliyor.
Perl dili 1.000.000 dosyayı 1 dakika 3 saniye civarında siliyor.
RSYNC komutu -delete ile kullanıldığında 1.000.000 dosyayı 1 dakika 2 saniye civarında silebiliyor.


Konuyla ilgili yapılan aramalar

  • linux dosya silme komutu
  • linux dizin silme
  • linux klasör silme