Sunday, March 6, 2016

Unix'de find Komutu Kullanımı


Unix işletim sisteminde komut satırında kullanabileceğiniz basit ama çok etkili komutlar bulunuyor: sed, awk, grep, find gibi. Bu yazıda find komutunu ele alacağız. find komutu ile dosyanın adı, boyutu, erişim zamanı, tipi, erişim hakları gibi farklı kriterlere göre dosyalar ya da dizin üzerinde arama işlemi gerçekleştirilebilir. find komutu üç bölümden oluşur:
  • Arama işleminin hangi dizinde yapılacağı
  • Arama kriterleri
  • Kritere uyan dosyalarla ne tür bir işlem yapılacağının tanımı
find komutu genel yapısı
/practices dizini altındaki tüm dosya ve dizinlerin listesini alalım:
find /practices
En basit haliyle sadece arama işleminin hangi dizinde gerçekleştirileceğini söyledik. find komutu, herhangi bir kriter vermediğimiz durumda /practices dizini altında derinliği ne olursa olsun tüm dosya ve dizinleri listeleyecektir. Bulunan dosyalarla ne işlem yapılacağını söylemedik. Var sayılan davranış, dosyanın adını ekrana listelemektir. İşletim sistemindeki tüm dosya ve dizinlerin listesi alınmak istenirse aşağıdaki basit komutu çalıştırmak yeterli olacaktır:
find /
find komutunu hiç bir parametre vermeden de çalıştırılabilir:
find
Bu durumda, komutu çalıştırdığımız dizin altında, derinliği ne olursa olsun tüm dosya ve dizinler listelenecektir. Komuta kritere uyan dosyaları listelemesi açık olarak da söylenebilir:
find / -print
Şimdi /practices dizini altında uzantısı sh ve py olan dosyaların listesini alalım:
find /practices -regextype posix-extended -regex ".*\.(py|sh)$" -print
Uzantısı sh ve py olan dosyalar için herkese çalıştırma hakkı verelim:
find /practices -regextype posix-extended -regex ".*\.(py|sh)$" -exec chmod +x  {} \;
-exec seçeneği ile kritere uyan dosya üzerinde hangi işlemin yapılacağını tanımlıyoruz. Kritere uyan dosya adını özel bir gösterimle ifade ediyoruz: {} \;. Örneğimizde dosya üzerinde uygulanacak işlemi chmod komutu ile veriyoruz. Eğer kritere uyan dosyalar üzerinde yapılan işlem kritik ise -ok seçeneği kullanılır. Bu durumda kullanıcıdan her bir dosya için işlem yapılmadan önce onay istenir:
find /practices -regextype posix-extended -regex ".*\.(py|sh)$" -ok chmod +x  {} \;

Arama kriterleri çok farklı olabilir:
  1. Tipe göre arama
    • -type f (dosya aranıyor)
    •  -type d (dizin aranıyor)
    • -type l (sembolik link aranıyor)
    • -type b (blok cihaz aranıyor, örneğin disk)
    • -type c (karakter cihaz aranıyor, örneğin terminal)
  2. Dosyanın boyutuna göre arama
    • -size +100M (100MB'dan büyük dosyalar aranıyor)
    • -size 1G (tam tamına 1GB boyutunda dosyalar aranıyor)
    • -size -100k (100kb'dan daha küçük dosyalar aranıyor)
  3. Dosyanın sahibine göre arama
    • -uid 512 (512 uid değerine sahip kullanıcının dosyaları arasında aranıyor)
    • -user jack (jack isimli kullanıcının dosyaları arasında aranıyor)
  4. Dosyanın güncellenme zamanına göre arama
    • -mtime +365Son 1 yıldır içeriği değişmeyen (aynı kalan) dosyalar
    • -mtime -7: Son bir hafta içinde içeriği değiştirilen dosyalar
  5. Dosyanın erişim zamanına göre arama
    • -atime +365: Son 1 yıldır erişilmeyen dosyalar
    • -atime -7: Son bir hafta içinde erişilen dosyalar
    • -atime 3: tam 3 gün önce erişilen dosyalar
  6. Dosyanın erişim haklarına göre arama
    • -perm /+x: çalıştırılabilir dosyalar, bunun yerine basitçe -executable seçeneği de kullanılabilir.
Yukarıda en temel arama kriterleri verilmiştir. Arama kriterlerinin tamamı için kullanım kılavuzuna başvurabilirsiniz.

Aranan dosyalar üzerinde yapabilecek işlemler:
  • -delete: bulunan dosyayı siler
  • -exec komut: verilen komutu bulunan dosya üzerinde çalıştırır
  • -ok komut: verilen komutu bulunan dosya üzerinde çalıştırır, çalıştırmadan önce kullanıcıdan onay ister
  • -print format: bulunan dosyanın bilgilerini verilen formatta listeler
Yukarıda en temel işlemler verilmiştir. Dosya ya da dizin üzerinde uygulayabileceğiniz işlemlerin tamamına kullanım kılavuzundan ulaşabilirsiniz.

Örnek Kullanımlar

Bir haftadan daha yaşlı ve bir haftadır erişilmeyen core isimli dosyaları silmek istiyoruz:
find . -name core -type f -atime +7 -mtime +7 -ok rm {} \;
*.o, a.out ve core isimli dosyaları silmek istiyoruz:
find . \( -name core -o -name a.out -o -name *.o -a -type f \) -ok rm {} \;
İçi boş dosyaları listelemek istiyoruz:
find . -empty -exec ls {} \;
Sticky biti çekilmiş tüm dizinleri listelemek istiyoruz:
find / -perm /o=t
/var/log dizininde /var/log/server.log dosyasından sonra yaratılan dosyaların listesini almak istiyoruz:
find /var/log -newer /var/log/server.log
/var/log dizininde 1 gündür değiştirilmeyen dosyaları sıkıştırmak ve 1 haftadan daha yaşlı olan dosyaları ise silmek istiyoruz:
find /var/log -ctime +0 -type f -exec compress {} \;
find /var/log -mtime +7 -type f -exec rm {} \;

No comments:

Post a Comment