Linux Üzerinde Find Komutunun Kullanımı

  Linux

İsminden de yabancı gelmeyecek duyar duymaz mantığını anlayabileceğiniz find komutunu anlatacağım. Önce nedir bu komut ne işe onu kavrayalım.

Bilinmeyen bir dizinde dosya aramak için kullanılır. Daha ileri seviyede dosya arama ile birlikte farklı işlevler içinde kullanımı mevcuttur.

Şimdi örneklerle kullanımını inceleyelim,

– Tüm sistem üzerinde test.txt dosyasını bulmak için,

– Yalnızca belirli bir dizinde aramak için,

– Büyük küçük harf duyarsız bir şekilde arama yapmak için,

– Test isminde tüm dizinleri bulmak için, (dikkat edin dosya değil dizin!)

– Adı “abcde” ile başlayan dosyaları bulmak için,

– Sistem üzerinde test.php dosyasını aramak için,

– Yada tüm php dosyalarını aramak için,

– Diyelimki 2 dosyamız var birisi “test1.txt” diğeri “test2.txt” olsun. Şimdi test1.txt veya test2.txt dosyalarını arayalım,

– Dosya izinlerine göre arama yapalım. Örneğin dosya izni 777 olanlar için,

– Yada belirli bir dizinde dosya izinleri 655 olanları arayalım,

– Dosya izni 777 hariç diğer tüm dosyaları bulalım. Bunu /home dizininde yapacağım yoksa bütün sistemi dökmeye çalışacak.

– SUID dosyalarını bulmak için,

– SGID dosyalarını bulmak için,

– SGID dosyalarında 644 olarak set edilmiş izinli dosyaları bulmak için,

– Read-Only Yani yalnızca okunabilir formatta dosyaları bulmak için,

– Çalıştırılabilir / Executable formattaki dosyaları bulmak için,

 Hazır dosya izinlerinden gitmişken “exec” komutu ile komut işletme yöntemlerine bakalım.

– Diyelimki 644 ile ayarlanmış izinli dosyaları bulalım ve bunları 777 ile değiştirelim. Bunun için,

– Yukarıdaki örneğimizi dosyalar için yaptık. Peki ya dizinlerin izinlerini bularak değiştirmek için,

– Diyelimki sistemde test.txt dosyasını arayacağız ve bulduğumuz yerde silmek istiyoruz. Bunun için,

– Bir dosya arayarak silme işlemini yaptık. Bu işlemi tüm .txt dosyalarını silmek için,

Not 1: Bu işlem kritik bir işlem. Bu nedenle /home dizininde yani bildiğim bir dizinde ve gerçekten emin olduğum için tüm .txt dosyalarını silerek yaptım.

Not 2: Genellikle bir dizin içerisinde tüm dosyaları silmek istendiği taktirde bu işlem yapılır. Örneğin x bir servise yada uygulamaya ait log dizininiz var ve “rm” komutunuz dosya boyutu ve sayısı çok olduğu için silmiyor hata veriyor (detay vermiyorum) tam bu noktada bu komut grubumuz ile temiz bir şekilde stabil silmek mümkün.

– Örneğin bir dizin içerisinde, içeriği boş olan tüm dosyaları bulmak için,

– Boş dosyaları yukarıdaki gibi bulduk. Fakat boş dizinleri nasıl listeleriz ?

– Belirli bir dizinde gizli dosyaları bulmak için,

– Sahibi salih kullanıcısı olan tüm dosyaları bulmak için,

– Yada yukarıdaki işlemimize özel belirli dosyaları bulmak için, (bunu .txt dosyaları için büyük-küçük harf duyarsız aratalım)

– Buraya kadar sahibine dosya yetkilerine göre aramalar yaptık. Peki gruplara göre nasıl yaparız. Örneğin ftp grubunun sahip olduğu dosyaları arayalım,

– Tamam grupların sahip olduğu dosyaları bulduk. Biraz ileri gidelim spesifik arama yapalım. Örneğin salih grubuna ait dizinleri bulalım,

– Yada bunu daha da spesifik hale getirelim. Grubu salih olan ve “.txt” olan tüm dosyaları büyük-küçük harf duyarsız bulalım,

Buraya kadar belirli dosya formatında, dosya izinlerine göre, sahip ve gruplarına göre gibi konularda find komutu ile arama yöntemlerini inceledik. Elbette bu konuları detaylıca açmak mümkün.

Şimdi ise dosyaları find ile farklı şekillerde arama yöntemlerine bakalım. Bu işlemleri belirli dizinlerde yapacağım (/home). Çünkü tüm sistem üzerinde uzun ve yorucu olacak binlerce kayıt çıkaracaktır.

– Örneğin son 5 gün içerisinde oluşturulmuş/değiştirilmiş dosyaları bulalım.

– Yada biraz spesifikleştirelim son 5-10 gün arasında değiştirilmiş dosyaları bulalım,

– Şöyle birşey de olabilir, son 5 gün içinde hangi dosyalara erişilmiş onları bulalım,

– Son 1 saat içerisinde oluşturulmuş tüm dosyaları bulmak için,

– Son 1 saat içerisinde değiştirilmiş tüm dosyaları bulmak için,

– Son 1 saat içerisinde erişilen tüm dosyaları bulmak için,

Olaya biraz farklı yaklaşalım.

– Örneğin dosya boyutu 20megabyte üzerindekileri arayalım bulalım,

– Fantazi diyebilirsiniz ama dosya boyutu 20 ile 50mb arasındaki dosyaları bulalım,

– Diyelimki dosya boyutu 20mb olanları bulduk. Bunları silmek istersek,

– Yukarıdaki satırı biraz daha spesifik hale getirelim, örneğin dosya boyutu 20mb olan ve “.txt” dosyalarını silelim,

– 200 karakterden fazla karakter içeren dosyaları aramak için,

Örnek olarak scripting için kullanılan bir tüyo vereyim. Mesela yukarılarda çıktısını aldığımız herhangi sonucu bir komuta girdi vermek için,

(Örneğin son 5 gün içinde değiştirilmiş dosyaları bulalım ve listeleyelim)

 Find komutu ile ilgili argüman ve ek komutlar bihayli çok olduğu için fazla detaya girmiyorum. Genellikle ve sık kullanılanları aşağıda açıklamaya çalıştım. Fakat ayrıntılı bilgi için man sayfasına göz atabilirsiniz.

Aşağıdaki şekilde help çıktısını ve kullanılabilecek argüman-komutları görebilirsiniz,

Detaylı bilgi için ise man sayfasını inceleyebilirsiniz,
http://linux.die.net/man/1/find

veya komut satırında,

Sık kullanılan argümanlar
-size 20M = Disk üzerinde 20mb yer kaplayan dosyalar için,
-size +20M = Disk üzerinde 20mb’dan fazla/büyük dosyalar için,
-size -20C = Disk üzerinde 20mb’dan fazla/küçük dosyalar için,
-ctime 5 = Tam olarak 5 gün önce oluşturulmuş/değiştirilmiş dosyalar veya dizinler için,
-ctime +5 = Tam olarak 5 günden daha uzun tarihte oluşturulmuş/değiştirilmiş dosyalar veya dizinler için,
-ctime -5 = Tam olarak 5 günden daha kısa tarihte oluşturulmuş/değiştirilmiş dosyalar veya dizinler için,
-mtime 5 = Tam olarak 5 gün önce değiştirilmiş dosyalar veya dizinler için,
-mtime +5 = Tam olarak 5 günden daha uzun tarihte değiştirilmiş dosyalar veya dizinler için,
-mtime -5 = Tam olarak 5 günden daha kısa tarihte değiştirilmiş dosyalar veya dizinler için,
-atime 5 = Tam olarak 5 gün önce erişim sağlanan dosyalar veya dizinler için,
-atime +5 = Tam olarak 5 günden daha uzun tarihte erişim sağlanan dosyalar veya dizinler için,
-atime -5 = Tam olarak 5 günden daha kısa tarihte erişim sağlanan dosyalar veya dizinler için,
-cmin 5 = 5 dakika önce oluşturulmuş/değiştirilmiş dosyalar ve dizinler için,
-mmin 5 = 5 dakika önce değiştirilmiş dosyalar ve dizinler için,
-amin 5 = 5 dakika önce erişim sağlanan dosyalar ve dizinler için,
-type f = (f) parametresi Files-Dosyalar için,
-type d = (d) parametresi Directory/Dizinler için,
-user salih = Salih kullanıcısı için,
-group salihin_grubu = salihin_grubu için,
-perm 755(farklı erişim numaraları olabilir) = Yetki tanımı 755 olan dosyalar veya dizinler için işlem yapılacağında kullanılır.
-newer test1.txt = test1.txt isimli dosya için sonraki bir saat/tarihte değişiklik yapılmış olan dosyalar ve dizinler ile işlem yapılacağında kullanılır.

Not “ctime” ile “mtime” parametrelerinin her ikiside dosyanın değişikliği ile ilgili işlem yapmak için kullanılır. Fakat aralarında çok ince bir fark vardır ki bu,
“-mtime” dosya içeriğinde yapılan değişikliklikleri kontrol ederken,
“-ctime” dosya içeriğindeki yapılan değişiklikleri ve özellikleri üzerinde yapılan değişiklikleri de kontrol eder.