find komutu nedir?

Daha yeni dosyaları aramak için başka bir çözümü find komutu kullanmaktır . Bu komut, statik bir veritabanı yerine canlı dosya sistemini arar. find komutunu kullanmak için arayacağımız dizini, opsiyonu ve sorgu şeklinde yapıyoruz. Şimdi find komutu ile hangi opsiyonlar ile arama yapabildiğimize göz atalım.

syntax

find [argüman] [opsiyon]

Dosyaları İsime Göre Bulmak

İlk olarak name opsiyonu ile arama gerçekleştirelim. İsme göre arama yaparken, dosya veya dizinin nerede olduğunu bilmediğim için kök dizinde arama gerçekleştireceğim. Tabi bu kısımda doğru sonuç almam için sudo yetkilerine sahip bir kullanıcıda işlem yapmam gerekecek. 

sudo find / -name dosya1

Aşağıda görüldüğü üzere canlı olarak kök dizini arayarak dosyamızı buldu. Path olarak dosyanın tam yolunu aşağıda çıktı olarak bize verdi.

Aşağıda bize verdiği yolun içini listeleyip kontrol ediyorum. Baktığımızda dosya1 ve Dosya1 adında iki tane dosya olduğunu görüyorum. Yukarıda yaptığımız aramada bize büyük harf ile başlayan dosyayı bulmamıştı. Bu aslında bir hata değildir. Linux dağıtımlarında büyük ve küçük harf duyarlı olduğunu biliyoruz. Doğru arama yapmak için opsiyon olarak name yerine -iname kullanmamız yeterlidir. Şimdi tekrar aynı aramayı gerçekleştiriyorum.

sudo find / -iname dosya1 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

Dosyaları Uzantıya Göre Bulmak

Dosyaları uzantılarına göre arayabiliriz. Bunun için joker karakter kullanmamız faydalı olacaktır. Örnek;

  • *.txt
  • *.conf
  • *.gz

Aşağıdaki örnekte, /etc dizin altında tüm .conf dosyalarını nasıl bulabileceğimizi gördük.

sudo find /etc -name *.conf 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

Yukarıdaki örneğin tam tersi olarak, arama yaptığımız isim hariç hepsinide getir diyebiliriz. Aşağıdaki örnekte -not opsiyonu ekleyerek dizin içindeki *.conf hariç hepsini çağırmış olduk.

sudo find /etc/ -not -name *.conf 

Dosyaları Türüne Göre Bulmak

Yaptığımız aramaları daha da özelleştirebiliriz. Şimdi biraz daha detaya inelim ve type opsiyonu ile örnekler gerçekleştirelim.

  • f dosya
  • d dizin
  • l symlink
  • + daha fazla 

Samba ile ilgili bir şeyler bulmam gerekiyor. Bu durumda bir tip belirtmediğim zaman dosya/dizin karışık arayacaktır. Ancak ben bir dosya üzerinde işlem yapacağım için dosya bulmam gerekiyor.  Aşağıdaki komut satırını yürüterek /etc dizininde samba isimli dosyaları buluyorum.

find /etc -type f -iname samba

Bu tam tersi de olabilirdi. Samba isimli dizinde arayabilirdik.

find /etc -type d -iname samba 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

Aramalarda herhangi bir isim belirtmek zorunda değiliz. Bu sadece aradığımız sonucu kolay bulmamıza sağlar. Şimdi ise bir dizin içindeki sembolik link aratalım. 

sudo find /media -type l

Görselde gözüktüğü gibi herhangi bir isim belirtmedim. Bu sayede isim ayrımı yapmadan tüm sembolik linklere baktı.

metin, ekran, ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Dosyaları Boyutuna Göre Bulmak

Dosya boyutuna göre dosyaları bulmak için size opsiyonu ile örnekler gerçekleştirelim.

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

Aşağıda ki örnekte kök  dizininde 100 megabytes olan dizinlerin ve dosyaların aramasını gerçekleştirdik.

sudo find / -size 100M 
metin, ekran, ekran görüntüsü, gümüş içeren bir resim

Açıklama otomatik olarak oluşturuldu

+ sembolü koyarak daha fazlası olarak arama gerçekleştirebiliriz. Aşağıdaki komut satırında 100M 'den daha fazla olanların aramasını gerçekleştirdik. Dikkat ederseniz, 100M olanları çıkarmayacaktır.

find / -size +100M 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

Birden fazla opsiyon kullanabilirsiniz. Aşağıdaki örnekte, /etc dizini altındaki 10 kilobytes'tan fazla .conf olan tüm dosyaların aramasını gerçekleştirdik.

sudo find /etc -type f -size +10k -name *.conf 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

Bu örnekte ise vereceğimiz boyuttan daha küçük olanları arayalım. Aşağıdaki komut satırında, /etc dizini altında 1 kilobytes'tan daha düşük olan tüm dosyaları arayalım.

sudo find /etc -size -1k 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

Dosyaları Değişiklik Tarihine Göre Bulmak

Dosyaları son değişiklik, erişim veya değişiklik zamanına göre de arayabiliriz. Boyuta göre arama yaparken olduğu gibi, "büyüktür" veya "küçüktür" için artı ve eksi simgelerini kullanmalıyız. Diyelim ki birkaç gün önce /etc dizini içinde yapılandırma dosyalarından birini değiştirdiniz ama hangisini unuttunuz. Aşağıdaki örnekte, son 1 gün içinde değiştirilmiş olan dizinin altındaki tüm dosyaları kolayca filtreleyebilirsiniz.

find /etc -mtime -1 

Yine farklı bir örnek vermek gerekirse, 35TB bir depolama alanınız var ve günlük 1TB yedeğiniz geliyor. Sizde bunu takip etmek ve silmek zorunda kalıyorsunuz. Böyle bir durumda find komutunu kullanarak nasıl yapılabileceğine bakalım. Bizim buradaki amacımız 30 günden sonraki eski verilerin silinmesi olacaktır. Yani 31. gün olduğunda en eski olan günü silecektir.

  • -mtime +30 yaparsak 30 günden sonrasını ilk aldığı günü yani en eskiyi silecektir.
  • -mtime -30 yaparsak ilk 30 gün yani güncel olan en yeni veriyi silecektir.

Toparlamak gerekirse yukarıda ki örneği baz alarak 30 günden eski verileri silmemiz gerekirse -mtime +30 kullanmamız gerekir.

İlk olarak 30 günden eski verileri teyit edelim.

find /path -mtime +30

Eğer her şey doğru ise 30 günden eski verileri silebiliriz.

find /path -mtime +30 -delete

Dosyalar üzerinde, yanlış verileri silmemek ve belirli uzantıları seçerek aynı işlemi yapabiliriz.

Aşağıda path klasörü içindeki sadece txt uzantılı dosya olanları 30 günden eski ise sil demiş oluyoruz.

find /path/ -name *.txt -type f -mtime +30 -delete

Bu işlemi crontab ile otomatik hale getirebilirsiniz.

İzinlere Göre Dosya Aramak

perm seçeneği, dosya izinlerine göre dosyaları aramanıza olanak tanır. Örneğin, /etc dizini içinde 700 yani kullanıcının tüm haklara sahip ancak grup ve diğerlerinin hiç bir yetkisi olmayan dosya ve dizinleri bulalım. Aşağıdaki örnekte 4 adet eşleşme gerçekleşti. Eşleşmeden bir tanesi doğrulamak için yetkilerini kontrol ettiğimde sonucun başarılı olduğunu görüyorum.

sudo find /etc/ -perm 700 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

SUID, SGID ve Sticky Biti İzinlerine Sahip Dosyaları Bulmak

İzinleri bulma kısmına gelmiş iken, önemli bir kısımdan kısaca bahsedelim. SUID , diğer kullanıcıların dosyayı dosya sahibinin etkin izinleriyle çalıştırmasını sağlayan yürütülebilir dosyalar için özel bir dosya iznidir. Yürütme izinlerini temsil eden normal yerine, kullanıcı için  SUID belirtmek için özel  bir harf “s” göreceksiniz. Bunun en güzel örneklerinden bir tanesi sudo komutudur.  sudo ile çalıştırılan komutun root olarak çalışabilmesi sudo programında aşağıda görülen s biti  yani setuid ile mümkün olmaktadır. Programlar kendisini çalıştıran kullanıcı yerine kendisine sahip olan root kullanıcının hakları ile çalışırlar.

SGID ise, yürütülebilir dosyalar için de geçerli olan ve diğer kullanıcıların dosya grubu sahibinin etkin GID'sini devralmasını sağlayan özel bir dosya iznidir. Benzer şekilde, yürütme izinlerini temsil eden olağandan ziyade, grup kullanıcısı için SGID'yi belirtmek için özel  bir harf “s” göreceksiniz. Bu izinlerede örnek olarak, crontab ve chage programlarını örnek verebiliriz.

Bu izinler çok önemlidir ve gereksiz kullanımlarda, sisteminizde zafiyete yol açacaktır. O yüzden bunları gerektiğinde bulmamız ve bilmemiz gerekir.  

Aşağıdaki örnek komut, -perm yalnızca izinleri 4000 olarak ayarlanmış dosyaları yazdır seçeneğini kullanarak geçerli dizinde SUID ayarlı tüm dosyaları bulacaktır.

sudo find / -perm /4000 

Aşağıdaki örnek komut, -perm yalnızca izinleri 2000 olarak ayarlanmış dosyaları yazdır  seçeneğini kullanarak geçerli dizinde SGID ayarlı tüm dosyaları bulacaktır.

sudo find / -perm /2000 

Hem SUID hem de SGID ayarlanmış dosyaları bulmak için aşağıdaki komutu çalıştırın.

sudo find / -perm /6000 

Son olarak Sticky biti ise ortak kullanım alanlarında kullanılan bir özelliktir. Siz bir dosyanın Sticky bit değerini aktif edersiniz o dosyayı tüm kullanıcılar erişebilir. İsterlerse yeni dosyalar oluşturabilir veya diğer kullanıcıların oluşturduğu dosyaları okuyabilir. Ama asla bir başka kullanıcının dosyasını silemez. Tüm dosyaları silme yetkisi sadece root kullanıcısına aittir. Bu özellik sticky bit ile sağlanır. Burada verebileceğimiz en güzel örnek dosya ise “/tmp” dosyasıdır. Şimdi sistem üzerindeki Stick bitleri nasıl bulabileceğimize bakalım.

Aşağıdaki örnek komut, -perm yalnızca izinleri 1000 olarak ayarlanmış dosyaları yazdır  seçeneğini kullanarak geçerli dizinde Sticky bit  ayarlı tüm dosyaları bulacaktır.

sudo find / -perm /1000 

Sahipliğe Göre Dosya Aramak

Belirli bir kullanıcı veya gruba ait dosyaları bulmak için -user ve -group seçeneklerini kullanın. Aşağıdaki örnekte, ilk olarak /var/log dizinindeki mysql kullanıcısına sahip olan dosya/dizin araması gerçekleştirdik ve doğruladık. İkinci örnekte ise, /var dizini içinde grup sahibi syslog olanları bulduk ve doğruladık. Buna benzer belirli bir kullanıcının makina üzerindeki tüm sahipliklerine bakabilirsiniz.

sudo find /var/log -user mysql
sudo find /var -group syslog 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

İstersek kullanıcı ve grup sahipliklerini de değiştirebiliriz. Aşağıdaki örnekte mehmet kullanıcısının ev dizininin sahipliklerini root kullanıcısına nasıl aktarabileceğimize bakalım. Bu işlemleri hakim olmadığınız sürece kullanmayınız, aksi halde sorun yaşarsınız. İlk olarak saiplikleri kontrol ettiğimde mehmet isimli dizinin kullanıcı ve grup sahibinin mehmet olduğunu görüyorum. İlk olarak kullanıcı sahipliğini değiştiriyorum ve doğruluyorum. Sonrasında ise kullanıcı ve grup sahipliklerini değiştiriyorum.

Sadece grup sahipliğini değiştirmek için,  :user yapmanız yeterlidir.

sudo find /home/mehmet -exec chown root {} \;
sudo find /home/mehmet -exec chown root:root {} \; 

Dosyaları Bulmak ve Silmek

Tüm eşleşen dosyaları silmek için -delete seçeneği, eşleşme ifadesinin sonuna ekleyebilirsiniz. Bu seçeneği yalnızca sonucun silmek istediğiniz dosyalarla eşleştiğinden emin olduğunuzda kullandığınızdan emin olun.  “-delete” seçeneği kullanmadan önce eşleşen dosyaları görmek her zaman hatalarını azaltır. Bu işlem kritik önem arz eder, bu yüzden belirlediğim bir dizin üzerinde işlemi gerçekleştireceğim. Yukarıda bahsettiğim gibi örnek kök dizin üzerinde bu işlemi yapacaksanız, ilk olarak sileceğiniz dosyaları öncesinde görüp daha sonra siliniz.

Örnek, /var dizini üzerinde gz uzantılı sıkıştırılmış tüm dosyaları sileceksiniz. Bunu yapmadan önce ilk olarak sileceğiniz dosyaları aratıp kontrol ediniz.

metin içeren bir resim

Açıklama otomatik olarak oluşturuldu

Şimdi, aşağıdaki örnekte .temp dosyalarını belli bir dizinden sileceğiz. İlk olarak dizinin içeriğini listeleyerek, .temp dosyasının olduğunu kontrol ediyorum ve komut satırını çalıştırıyorum. Sonra tekrar dizinin içeriğini kontrol ettiğinde silindiğini görebilirsiniz.

sudo find /home/mehmet/ -name *.temp -delete 
metin içeren bir resim

Açıklama otomatik olarak oluşturuldu
Blog'a Dön