find Komutu ve Kullanımı
Dosya arama işlemlerinde, erişimlerde olduka sık kullanılan komutlardan biri olan find
komutuna geldi sıra.
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"' _ {} \;
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
dizinf
basit dosyal
sembolik linkP
FIFOs
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 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.
- find (1) — Linux manual page. man7 ↩
- Ravi Saive. (2020). 35 Practical Examples of Linux Find Command. Tecmint ↩
- find command in Linux with examples. GeeksforGeeks ↩
- Find Files in Linux, Using the Command Line. Linode ↩
- Linux find command tutorial (with examples ↩
- Sheryl Calish. (2008). Guide to Linux Find Command Mastery. Oracle ↩