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
- Delete Files Older Than x Days on Linux – https://www.howtogeek.com/howto/ubuntu/delete-files-older-than-x-days-on-linux/
- command line – Removing files older than 7 days – Ask Ubuntu – https://askubuntu.com/questions/589210/removing-files-older-than-7-days
- How to delete files older than 30 days in Linux – TecAdmin – https://tecadmin.net/delete-files-older-x-days/
- 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