16.06.2025

Linux'ta find komutu

Dosya aramak. Bitmez tükenmez bir ihtiyaç. Bütün işlevlerin de yıllar önce tasarlanmış bir find komutunun yetenekleri ile hala yapılabiliyor olması ilginç.

En çok kullandığım işlev, en son değişiklik tarihine göre dosya aramak; muhtemelen kısmi dosya ismi ile birlikte. Son 1 gün içinde değişen dosyaları bulmak için

find /home/metin/documents -type f -iname '*rapor*.txt' -mtime 1

Burada en sondaki rakamın yanında artı veya eksi olmadığından tam 1 gün önce (1 ile 2 arasındakileri; yani 24 saat ve 48 saat önce değişenleri) değişenleri bul demek. 1 günden önce değişenler demek için

find . -type f -iname '*rapor*.txt' -mtime +1

Bir günden daha önce (24 saatten daha kısa süre önce) değişenleri bul demek için ise

find . -type f -iname '*rapor*.txt' -mtime -1

demek gerek.

Son 10 dakika içinde değişen (oluşan) dosyaları görmek için

find . -type f -mmin -10

Son 10 dakika ile 30 dakika arasında değişen dosyaları görmek için

find . -type f -mmin +10 -mmin -30 

Daha net bir tarih ve saat bilgisi için -newermt parametresi kullanılabilir. Örneğin 1 Ocak 2024'ten sonra değişen txt uzantılı dosyalar için

find . -type f -newermt '2024-01-01'
find . -type f -newermt 'Jan 1 2024'
find . -type f -newermt '2024-01-01 01:25 PM'

gibi komutlar kullanılabilir. En sondaki örnek diğerleri ile eşdeğer değil, saat farkı ile farklı sonuçlar üretir, sadece ISO tarih biçimindeki saat bilgisini göstermek için verdim.

Bu parametre daha esnek kullanıma da sahip. Örneğin

find . -type f -newermt 'yesterday'
find . -type f -newermt '2 weeks ago'
find . -type f -newermt '6 hours ago'

Hatta belli bir tarih aralığı için ünlem "!" işareti aralık sonu belirlenebilir. Örneğin 1 Ocak 2024 ile 31 Nisan 2024 arasını belirtmek için

find . -type f -newermt "2024-01-01" ! -newermt "2024-04-31"

Bir dosyanın oluşturulmasından daha sonra oluşturulmuş (düzenlenmiş) dosyaları bulmak da mümkün. Örnek dosyamız /home/metin/referans_dosya olsun. 

find . -type f -newer /home/metin/referans_dosya

Tüm tarih verileri sistemin yerel saatine göre yapılıyor.

Başka bir kriter de dosya boyutu. Genelde ihtiyacım olan belli bir boyutun üzerinde olan dosyalar. 2 GB'tan büyük ISO dosyaları için

find . -type f -iname '*.iso' -size +2G

Tam tersi, 2 GB'tan küçük iso dosyaları için ise, tahmin edilebileceği gibi boyut belirten 2'nin yanındaki artı '+' işaretini eksiye '-' çevirerek

find . -type f -iname '*.iso' -size -2G

find komutu sonrasında dosyanın ls ile gösterilen ayrıntılarını görmek istiyorsak iki seçenek var. -exec kullanmak, ya da find'in kendi -ls parametresini kullanmak. İki örnek

find . -type f -newermt 'yesterday' -exec ls -l {} \;
find . -type f -newermt 'yesterday' -ls

İlk örneğin sonundaki \; işareti ls komutunu bulunan her dosya için ayrı ayrı çalıştır demek. Her birini toplayıp tek seferde ls çalıştırmak için bunun yerine \+ kullanmak gerek.

İkinci örnekteki -ls parametresi, normal ls komutunun çıktısına göre 2 fazla sütun veri üretir. İlk sütun bulunan dosyanın dosya sistemindeki inode numarası. İkinci sütun ise bu dosyanın dosya sisteminde kaç blok kapladığını gösterir (sistemimizde bir blok kaç byte diye bakmak istersek sudo tune2fs -l /dev/sda). Aslında ls -li komutu ile de bu sütunlara ulaşmak mümkün.

Sadece bulunduğumuz klasördeki dosyalarla ilgileniyorsak ve en son değiştirilenleri bulmak istiyorsak

ls -ltR

Bu şekilde değiştirilme zamanlarına (-t) göre sıralar. En son değiştirilenlerin en altta yer alması için (-R) kullanılır, yoksa en son değişenler en üstte yer alır. Sadece son değişen 10 tane ile ilgileniyorsak

ls -lt | head

kullanabiliriz. Dosya boyutuna göre sıralamak için -S kullanılabilir. Bu da varsayılan olarak büyükten küçüğe sıralar. En büyük 5 dosyayı listelemek için

ls -lS | head -5

---

https://www.cyberciti.biz/faq/linux-unix-osxfind-files-by-date/

Hiç yorum yok: