"Enter"a basıp içeriğe geçin

Linux’ta Belli Bir Günden Daha Eski ya da Daha Yeni Dosyaları Silme

Sunucularda belli bir zaman sonra yedekleme veya loglama işlerinden dolayı çok fazla gereksiz dosya oluşabilmektedir. Bu da zamanla disklerin dolmasına ve depolama ile ilgili problemler oluşmasına neden olacaktır. Bu problemi gidermek için bir zaman sonra gereksiz hale gelen bu dosyaları belli periyotlarla silmemiz gerekir.

Önemli Not: Lütfen burada anlatılan silme işlemlerini yapmadan önce hangi dosyaların sileceğinizden emin olunuz.

Linux’ta bu silme işlemini yapmak için birkaç farklı yol mevcut. Ancak ben bunun, bazı kaynaklarda best practice olarak da nitelendirilen, find komutu ile nasıl yapılacağını ele alacağım. Find komutu bilindiği üzere Linux’ta arama işlevini yerine getiren komut. Find komutu ile arama yaparken belirli bir günden daha eski veya daha yeni dosya veya klasör nesnelerini bulabilir, bulunan her bir nesne için belli bir komutu çalıştırabiliriz. Komut olarak rm verdiğimizde (veya parametre olarak -delete kullandığımızda) bulunan dosya veya klasörleri silebiliriz.

Burada örnekler üzerinden ilerlemek daha uygun olacak.

30 Günden Eski Dosyaları Silmek

Örneğin Linux sunucumuz üzerinde bir Oracle veritabanı çalışıyor olsun. Oracle veritabanı çok sayıda trace ve alert logları ürettiğinden bir süre sonra bu loglar hayli fazla yer tutacaktır. Bu dosyaların belli bir günden eski olanları (örneğin 7 gün, 20 gün, 30 gün) belli periyotlarla (stratejinize göre değişmekle birlikte haftada bir veya ayda bir olabilir) temizlenmesi gerekir.

Bu örnek 30 günden daha eski alert ve trace logları bularak silinmesini sağlayacak (rm komutu ile silmek yerine başka bir backup alanına taşımayı da düşünebilirsiniz).

# find /u01/app/oracle/diag/tnslsnr/oracle/listener/trace -type f -mtime +30 -exec rm {} \;

Burada -exec parametresinden bahsetmek istiyorum. Bu parametre ile find komutunun sonuçları üzerinde başka bir komut çalıştırabiliyorsunuz. Yukarıdaki örnek komut satırında -exec parametresinden sonra gelen rm Linux’taki dosya veya klasör silme komutu, hemen arkasından gelen {} ifadesi find komutu sonucunda dönen her bir dosya veya klasörü belirten yer tutucu, \; ifadesi ise -exec işleminin sonunu belirtiyor.

Diğer bir parametre olan -type parametresi ile aranacak nesne türünü belirtiyoruz. Dosya ise f(file), klasör ise d (directory) olarak belirtiyoruz.

Aranacak dosyaların zaman ilişkilerini de -mtime parametresi ile veriyoruz. Örnekteki +7 ifadesi 7 günden daha eski anlamına geliyor. 7 günden daha yeni dosyaları bulmak isteseydik -7 ifadesini kullanmamız gerekecekti. Birden fazla -mtime parametresini kullanarak zaman aralığı da belirtebiliriz.

Şimdi silme işlemini bir de find komutunun -delete parametresiyle yapalım.

# find /u01/app/oracle/diag/tnslsnr/oracle/listener/trace -type f -mtime +30 -delete

Burada -delete parametresi find komutu ile ne bulunduysa hepsini siler. Ancak klasörleri silmek istediğimizde klasörün içi boş değil şeklinde bir hata ile karşılaşacağız. Bu yüzden klasör silmek istediğimizde bu ayrıntıya dikkat edelim.

Belli Uzantıya Sahip Dosyaları Silmek

Tüm dosyaları silmek yerine, belli bir uzantıya sahip dosyalar için filtre koyabilir. Örneğin, yalnızca “.xml” uzantılı ve 30 günden önce değiştirilmiş dosyaları silmek istediğimizi varsayalım.

# find /u01/app/oracle/diag/tnslsnr/oracle/listener/trace -type f -name "*.xml" -mtime +30 -exec rm {} \;

Burada -name parametresi ile joker karakter kullanarak dosya adı üzerinde filtreleme yapabiliyoruz. Biz "*.xml" ifadesi ile tüm xml uzantılı dosyaları istediğimizi belirtiyoruz. Bu parametre ile ilgili daha fazla detay için find komutunun man sayfalarına bakabilirsiniz.

Klasörleri Alt Klasörleriyle Birlikte Silmek

Klasör silme işleminde find komutuyla birlikte Linux rm komutunu kullanmamız gerekiyor. Çünkü klasörün boş olmaması durumunda -delete seçeneğinin kullanılması hatayla sonuçlanacaktır. Aşağıdaki komut, “trace” klasörü altında bulunan ve en son 30 günden önce değiştirilen tüm klasörleri arayacaktır.

# find /u01/app/oracle/diag/tnslsnr/oracle/listener/trace -type d -mtime +30

Aşağıdaki komut satırında -exec parametresini kullanarak rm komutunu -rf parametresi ile çalıştırdık ve find komutunun çıktısını rm komutuna girdi olarak göndererek bulunan tüm klasörlerin alt klasörleriyle birlikte silinmesini sağladık.

# find /u01/app/oracle/diag/tnslsnr/oracle/listener/trace -type d -mtime +30 -exec rm -rf {} \;

Bu yazıda find komutunu çeşitli parametreleriyle birlikte kullanarak belli bir zamandan eski ya da yeni dosya veya klasörlerin nasıl silineceğini irdeledik.

Kaynaklar

  1. Delete Files Older Than x Days on Linux – https://www.howtogeek.com/howto/ubuntu/delete-files-older-than-x-days-on-linux/
  2. command line – Removing files older than 7 days – Ask Ubuntu – https://askubuntu.com/questions/589210/removing-files-older-than-7-days
  3. How to delete files older than 30 days in Linux – TecAdmin – https://tecadmin.net/delete-files-older-x-days/
  4. find’s “-exec rm {} \;” vs “-delete” – Unix & Linux Stack Exchange – https://unix.stackexchange.com/questions/167823/finds-exec-rm-vs-delete

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir