find Komutu ve Kullanımı

Dosya arama işlemlerinde, erişimlerde olduka sık kullanılan komutlardan biri olan find komutuna geldi sıra.

AA

Find komutunun popüler kullanımı, name opsiyonu ile klasör yolu içerisinde arama yapmak olsa da özelleştirildiğinde çok daha spesifik ihtiyaçlara da cevap verebilmekte1. Temel işlemleri ile başlayıp farklı amaçlar doğrultusunda nasıl çözümler sunduğuna adım adım değineceğim örneklere geçelim o halde2.

Find Komutu İle Arama İşlemleri

Temel kullanımı şu şekilde:

find [arama-yapilacak-dizin] [opsiyon] [aranacak-orgu]

Find Dosya Arama İşlemleri

Örneklere başlayalım3. İlk örneğimiz sunucuda bulunan apache error.log dosyalasını bulmak olsun.

find / -name "error.log"

Ya da type kullanarak;

find / -type f -name "error.log"

Bu komut uygulandığında sistemdeki diğer servislerde bulunan error.log dosyaları da listelenecektir. Sunucudaki tüm *.log dosyaları bulmak istersek aşağıdaki komut işimize yarayacaktır.

find / -name "*.log"

Biraz daha detaylandırılmış birkaç işlem üzerinden örneklere devam edelim4. Birden fazla dosyayı aynı anda aratalım. Bulmak istediğimiz dosyalar da access.log ve error.log olsun.

find / -type f ( -name "access.log" -o -name "error.log" ) -print

Bulunduğumuz dizin ve alt klasörlerini ya da dosyaları tek bir komutla silelim. Dosya ve klasör ifadesini örnekteki -type d|f ile değiştirebilisiniz.

find . -type d -delete

Bu örnekte bulunduğumuz dizindeki tüm *.php uzantılı dosyaların içeriği taransın, www.ornekwebsitesi.com ifadeleri www.yeniornekwebsitesi.com olarak değiştirilsin. Bu işlem için -exec yardımı alacağız ve böylelikle birden fazla komut uygulayabileceğiz.

find . -name '*.php' -exec sed -i 's/www.ornekwebsitesi.com/www.yeniornekwebsitesi.com/g' {} \;

Dosya içeriğindeki metin değişikliklerini dosya isimleri üzerinden biraz daha geliştirelim5. İşlemimiz bulunduğumuz dizin ve alt klasörlerin taranıp içerikleri dosyalardaki büyük harflerin küçük harf olarak değiştirilmesi olsun.

find . -type f -name '*[a-z]*' -execdir bash -c '! test -f "$(echo "$0" | tr "[:lower:]" "[:upper:]")"' {} \; -execdir bash -c 'mv "$0" "$(echo "$0" | tr "[:lower:]" "[:upper:]")"' {} \;

İsim üzerinden gerçekleştirdiğimiz aramaları -size (boyut) bağlamında gerçekleştirelim. Öncelikle boyut kısaltmalarına bir bakalım.

  • k kilobytes (1024 bytes)
  • M megabytes (1024 kilobytes)
  • G gigabytes (1024 megabytes)
  • T terabytes (1024 gigabytes)
  • P petabytes (1024 terabytes)

İlk olarak, /var/www/html/ dizini içerisinde, boyutu 10MB olan dosyaları listeleyelim.

find /var/www/html/ -type f -size 10M

Şimdi örneğimizi en az/en çok şeklinde düzenleyelim. Aşağıdaki ilk kod boyutu 1M üzerinde olan *.jpg uzantılı görselleri listeleyecektir.

find / -type f -name "*.jpg" -size +1M

-size değerini negatif olarak belirttiğimizde ise boyut karşılaştırması belirtilen boyutun altındakilerin listelenmesini sağlar. Yani, aşağıdaki kod bize boyutu 1M altındaki *.jpg uzantılı görselleri iletir.

find / -type f -name "*.jpg" -size -1M

Boyut karşılaştırma işlemini belirli bir aralık belirterek de gerçekleştirmek mümkün olmaktadır.

find /home -type f -name "*.jpg" -size +100k -size -1M

Yukarıdaki kod bize boyutu 100KB üzerinde ve 1MB altındaki dosyaları listeler. Dosya içindeki karakterlere göre bir işlem gerçekleştirmek istersek şöyle bir yol izleyebiliriz. Aşağıdaki komut /var/www/html/ yolu içerisinde, içeriğinde 500 ve üzeri karakter bulunan *.css dökümanlarından theme yoluna denk gelenleri işaretleyerek bize sunacaktır.

find /var/www/html/ -type f -iname "*.css" -size +500c | grep "themes"

Yine dosya içeriğinde arama yapıp -exec üzerinden belirlediğimiz (aşağıdaki örnekte: UFW BLOCK) ifadeyi bulup grep ile işaretleyelim.

find / -name '*.log' -exec grep -H --color "UFW BLOCK" {} \;

-exec kullanımını bu defa -size ile birlikte gerçekleştirelim ve sunucumuzda boyutu 50MB üzerinde olan dosyaları bulup, otomatik silelim.

Bu işlemleri denerken dosya kayıpları yaşayabileceğinizi bilmelisiniz.

find /home -type f -size +50M -exec rm -rf {} ;

Son olarak, belirttiğimiz dizindeki *.png uzantılı dosyaların webp kopyalarını oluşturalım.

find ./ -type f -name '*.png' -exec sh -c 'cwebp -q 75 $1 -o "${1%.png}.webp"' _ {} \;
File klasör arama işlemi

Find Klasör Arama İşlemleri

Sadece dosya isimlerinde aramayla sınırlı değiliz elbette. Klasör aramaları öncesinde -type (tip) ifadelerine bir göz atalım.

  • b özel blok dosyası
  • c özel karakter dosyası
  • d dizin
  • f basit dosya
  • l sembolik link
  • P FIFO
  • s soket

Şimdi de bir klasör arama işlemi gerçekleştirelim.

find / -type d -name [klasor-adi]

Bu arada, tüm işlemlerin harf duyarlı olduğunu hatırlatayım. Büyük/küçük harf ayrımı olmaksızın arama işlemlerinin gerçekleştirilebilmesi için -iname yardımı alabiliriz.

find / -type d -iname 'httpdocs'

Belirli bir dizin içerisinde arama yapmak istediğimizde [arama-yapilacak-dizin] alanında ilgili dizini belirtmemiz yeterli olacaktır. Aşağıdaki örnekte /var/www içerisindeki *.php uzantılı dökümanlar listelenip içlerinden isminde class geçenler işaretlenecektir.

find /var/www -iname "*.php" | grep -i "class"

Bir klasör içeriğindeki (örneğin /var/www/html/wp-content/ olsun) dosya adedine ihtiyacımız var diyelim. O halde komutumuz şu şekilde kullanılabilir.

find /var/www/html/wp-content/ -type f -name * -print | wc -l

-exec kullanımını bu defa klasör arama işleminde uygulayalım. Yapacağımız işlem, bir klasörün alt klasör yapısını dosyalar olmadan başka bir klasöre kopyalamak olsun. Örnek işlemi wordpress > wp-content > themes klasörü içerisindeki temalara ait klasör yapısının bir üst dizindeki themesBackup klasörüne taşıyarak gerçekleştirelim.

find * -type d -exec mkdir /var/www/html/wp-content/themesBackup/{} \;
Find ve pipe kullanımı

Find Komutunun Pipe İle Kullanımı

Bu defa arama yapmanın ötesinde, arama temelli belirli bir işlemin gerçekleşmesini amaçlayalım. Örneğin, wp-uploads altındaki *.jpg uzantılı dosyaları bulup belirleyeceğimiz bir isim altında arşivleyelim.

find /var/www/html -type f -name "*.jpg" | xargs tar cvf images.tar

Şimdilik find komutuyla ilgili örneklendirmeler bu kadar6. Yeri geldikçe konuları derleyip ayrı bir yazı içerisinde devamını getireceğim. Öncesinde daha detaylı bilgi almak isterseniz yine man find komutuyla komut ve opsiyonlarla ilgili genişletilmiş açıklamalara ulaşabilirsiniz.