Linux find Komutu: Dosya Arama ve Toplu İşlemler Rehberi

Sistem yöneticiliğinde zamanın büyük bir kısmı dosya aramakla, belirli kriterlere uyan dosyaları bulmakla ve bu dosyalar üzerinde toplu işlemler yapmakla geçer. İşte tam bu noktada find komutu devreye giriyor. Linux dünyasının en güçlü araçlarından biri olan find, basit bir dosya aramasının çok ötesinde yeteneklere sahip. Bu rehberde find komutunu A’dan Z’ye ele alacağız, gerçek dünya senaryolarıyla pekiştireceğiz.

find Komutunun Temel Yapısı

find komutunun genel sözdizimi şu şekilde:

find [arama_dizini] [seçenekler] [eylemler]

Arama dizini belirtmezseniz, komut bulunduğunuz dizinde çalışır. Kök dizinden aramak istiyorsanız / kullanırsınız, ev dizininden aramak için ~ yeterli olur.

En basit kullanım örneğiyle başlayalım. Şu an bulunduğunuz dizin altındaki tüm dosyaları listelemek için:

find .
find /home/kullanici
find ~

Bu komutlar dizin ağacını özyinelemeli (recursive) olarak gezer ve bulduğu her şeyi ekrana basar. Gerçek sistemlerde bu çıktı binlerce satır olabilir, bu yüzden filtreleme seçeneklerini öğrenmek kritik önem taşır.

Dosya Adına Göre Arama

En sık kullanılan seçenek olan -name, büyük/küçük harf duyarlı arama yapar.

# Tam dosya adıyla arama
find /etc -name "nginx.conf"

# Wildcard ile arama
find /var/log -name "*.log"

# Büyük/küçük harf duyarsız arama
find /home -iname "readme.txt"

# Birden fazla uzantı araması
find /var/www -name "*.php" -o -name "*.html"

-name: Büyük/küçük harf duyarlı dosya adı araması yapar

-iname: Büyük/küçük harf duyarsız arama yapar

-o: OR operatörü, birden fazla koşulu birleştirmek için kullanılır

Dikkat etmeniz gereken önemli bir nokta: wildcard kullanırken tırnak işareti kullanmayı unutmayın. find /var -name *.log yazdığınızda shell önce wildcard genişletmesi yapabilir ve beklenmedik sonuçlar alabilirsiniz.

Dosya Tipine Göre Filtreleme

find sadece dosya adına göre değil, dosya tipine göre de filtreleme yapabilir. -type seçeneği bunun için kullanılır.

-type f: Normal dosyalar

-type d: Dizinler

-type l: Sembolik linkler

-type b: Block device dosyaları

-type c: Character device dosyaları

-type p: Named pipe (FIFO) dosyaları

-type s: Socket dosyaları

# Sadece dizinleri listele
find /var/www -type d

# Sadece sembolik linkleri bul
find /usr/bin -type l

# Tüm normal dosyaları bul
find /home -type f -name "*.conf"

Gerçek dünyada bu seçenek çok işe yarar. Örneğin bir web sunucusunda yanlış izinler verilmiş dizinleri tespit etmek istediğinizde -type d ile sadece dizinleri filtreleyip izin kontrolü yapabilirsiniz.

Boyuta Göre Arama

Disk dolduğunda ilk yapmanız gereken şeylerden biri büyük dosyaları bulmaktır. find komutunun -size seçeneği tam burada iş görür.

# 100MB'dan büyük dosyaları bul
find / -type f -size +100M

# Tam olarak 1GB olan dosyaları bul
find /backup -type f -size 1G

# 1KB'dan küçük dosyaları bul
find /tmp -type f -size -1k

Boyut belirtirken kullanılan birimler:

c: Byte

k: Kilobyte (1024 byte)

M: Megabyte

G: Gigabyte

b: 512 byte’lık bloklar (varsayılan)

+ işareti “büyüktür”, - işareti “küçüktür” anlamına gelir. İşaretsiz kullanırsanız tam eşleşme arar.

Gerçek senaryo: Bir müşterinin sunucusunda disk doluluk alarmı geldi. Şu komutla problemi hızlıca tespit edebilirsiniz:

find / -type f -size +500M -exec ls -lh {} ; 2>/dev/null | sort -k5 -hr

Bu komut 500MB’dan büyük tüm dosyaları bulur, boyutlarını insan okunabilir formatta listeler ve boyuta göre sıralandırır. 2>/dev/null ise erişim izni hatalarını gizler.

Zamana Göre Arama

Log yönetimi, güvenlik incelemeleri ve backup süreçlerinde dosyaları değiştirilme veya erişim zamanına göre aramak çok kritiktir.

-mtime n: Son n gün içinde içeriği değiştirilen dosyalar

-atime n: Son n gün içinde erişilen dosyalar

-ctime n: Son n gün içinde metadata’sı değişen dosyalar (izin, sahip vs.)

-mmin n: Son n dakika içinde değiştirilen dosyalar

-newer dosya: Belirtilen dosyadan daha yeni oluşturulan dosyalar

# Son 7 gün içinde değiştirilen dosyaları bul
find /var/www -type f -mtime -7

# 30 günden eski log dosyalarını bul
find /var/log -name "*.log" -mtime +30

# Son 1 saat içinde değiştirilen dosyalar
find /etc -mtime -1 -mmin -60

# Belirli bir dosyadan sonra oluşturulan dosyaları bul
find /home -newer /tmp/referans_dosya

Güvenlik senaryosu: Sisteme yetkisiz erişim şüphesi var ve son 24 saat içinde /etc dizininde değiştirilen dosyaları kontrol etmek istiyorsunuz:

find /etc -mtime -1 -type f -ls

Bu komut dosya adlarının yanı sıra tam dosya bilgilerini de gösterir, böylece şüpheli değişiklikleri hızlıca tespit edebilirsiniz.

İzinlere Göre Arama

Güvenlik açısından en kritik kullanım alanlarından biri yanlış izinlere sahip dosyaları bulmaktır.

-perm mod: Tam olarak belirtilen izinlere sahip dosyalar

-perm -mod: En az belirtilen izinlere sahip dosyalar

-perm /mod: Belirtilen izinlerden herhangi birine sahip dosyalar

# SUID bit'i set edilmiş dosyaları bul (güvenlik kontrolü)
find / -perm -4000 -type f 2>/dev/null

# SGID bit'i set edilmiş dosyaları bul
find / -perm -2000 -type f 2>/dev/null

# Herkes tarafından yazılabilir dosyaları bul
find /var/www -perm -o+w -type f

# 777 izinli dosyaları bul
find / -perm 777 -type f 2>/dev/null

Bu komutlar bir güvenlik denetimi sırasında mutlaka çalıştırmanız gereken sorgu setinin parçasıdır. SUID/SGID dosyaları privilege escalation saldırılarında kullanılabileceğinden düzenli olarak kontrol edilmelidir.

Sahibine Göre Arama

Çok kullanıcılı sistemlerde belirli bir kullanıcı veya gruba ait dosyaları bulmak gerekebilir.

-user kullanici: Belirtilen kullanıcıya ait dosyalar

-group grup: Belirtilen gruba ait dosyalar

-nouser: Sistemde var olmayan bir kullanıcıya ait dosyalar

-nogroup: Sistemde var olmayan bir gruba ait dosyalar

# ahmet kullanıcısına ait tüm dosyalar
find /home -user ahmet -type f

# www-data grubuna ait dosyalar
find /var/www -group www-data

# Sahipsiz dosyaları bul (güvenlik kontrolü)
find / -nouser -o -nogroup 2>/dev/null

# Belirli kullanıcıya ait büyük dosyaları bul
find /home -user ahmet -size +50M -type f

Gerçek senaryo: Bir çalışan şirketten ayrıldı ve hesabı silindi. Sistemde o kullanıcıya ait orphan dosyalar kalmış olabilir. -nouser seçeneği bu durumda hayat kurtarır.

-exec ile Toplu İşlemler

find komutunun gerçek gücü burada ortaya çıkıyor. -exec seçeneği bulunan dosyalar üzerinde otomatik olarak komut çalıştırmanızı sağlar.

# Bulunan dosyaları sil
find /tmp -type f -mtime +7 -exec rm {} ;

# Bulunan dosyaları ls ile listele
find /home -name "*.txt" -exec ls -la {} ;

# Dosyaların sahipliğini değiştir
find /var/www -type f -exec chown www-data:www-data {} ;

# Dosya izinlerini toplu değiştir
find /var/www/html -type f -exec chmod 644 {} ;
find /var/www/html -type d -exec chmod 755 {} ;

{} bulunan dosyanın yerini tutar. ; her dosya için komutu ayrı ayrı çalıştırır. Daha hızlı bir alternatif olan + kullanırsanız dosyalar toplu olarak komuta iletilir:

# ; yerine + kullanımı (daha hızlı)
find /tmp -name "*.tmp" -exec rm {} +

+ ile kullandığınızda find mümkün olduğunca çok dosyayı tek bir komut çağrısında işler, bu da büyük dizin ağaçlarında ciddi performans farkı yaratır.

-delete ve Güvenli Silme

-exec rm yerine -delete kullanmak bazı durumlarda daha güvenli ve hızlıdır. Ancak bu seçeneği kullanırken dikkatli olun, geri dönüşü yoktur.

# 30 günden eski geçici dosyaları sil
find /tmp -type f -mtime +30 -delete

# Boş dizinleri temizle
find /var/www -type d -empty -delete

# Belirli uzantılı dosyaları sil
find /home/kullanici/Desktop -name "*.bak" -delete

Altın kural: -delete veya -exec rm kullanmadan önce mutlaka önce sadece find ile arama yapın ve silinecek dosyaların listesini gözden geçirin. Sonra silme işlemini gerçekleştirin.

-xargs ile Kullanım

find çıktısını xargs ile pipe’lamak, -exec kullanımına alternatif ve kimi zaman daha esnek bir yöntemdir.

# find + xargs ile dosya silme
find /tmp -name "*.log" -mtime +7 | xargs rm -f

# Dosya içinde metin arama (grep ile)
find /var/www -name "*.php" | xargs grep -l "eval(base64_decode"

# Dosyaları başka dizine kopyala
find /backup -name "*.sql" -mtime -1 | xargs -I {} cp {} /mnt/external/

# Paralel işlem için -P seçeneği
find /data -name "*.gz" | xargs -P 4 -I {} gzip -d {}

Güvenlik senaryosu: Web sunucunuzda backdoor arama. PHP dosyalarında şüpheli kodları tarıyorsunuz:

find /var/www -name "*.php" | xargs grep -l "eval(base64_decode" 2>/dev/null
find /var/www -name "*.php" | xargs grep -l "system|exec|passthru" 2>/dev/null

Bu iki komut ile web root altındaki tüm PHP dosyalarını tarayarak potansiyel backdoor’ları tespit edebilirsiniz.

Çoklu Koşul Kullanımı

Gerçek dünya senaryolarında genellikle birden fazla kriteri aynı anda kullanmanız gerekir.

AND Koşulu

# 7 günden eski VE 10MB'dan büyük log dosyaları
find /var/log -name "*.log" -mtime +7 -size +10M -type f

# www-data'ya ait VE executable dosyalar
find /var/www -user www-data -perm -u+x -type f

AND koşulunda seçenekleri arka arkaya yazmanız yeterli, varsayılan davranış AND’dir.

OR Koşulu

# .jpg veya .png dosyaları
find /home -type f ( -name "*.jpg" -o -name "*.png" )

# root veya www-data'ya ait dosyalar
find /var/www ( -user root -o -user www-data ) -type f

NOT Koşulu

# .log uzantısı olmayan dosyalar
find /var/log -type f ! -name "*.log"

# root'a ait olmayan SUID dosyalar
find / -perm -4000 ! -user root -type f 2>/dev/null

Arama Derinliğini Sınırlamak

Büyük dizin ağaçlarında bazen belirli bir derinlikte aramak istersiniz. -maxdepth ve -mindepth seçenekleri bunun için kullanılır.

-maxdepth n: En fazla n seviye derinliğe in

-mindepth n: En az n seviye derinlikten başla

# Sadece /etc altında, alt dizinlere inmeden ara
find /etc -maxdepth 1 -name "*.conf"

# Sadece 2. seviye dizinleri listele
find /home -mindepth 1 -maxdepth 2 -type d

# /var/log altında sadece doğrudan dosyaları listele
find /var/log -maxdepth 1 -type f -name "*.log"

Prune ile Dizin Atlama

Bazı dizinleri arama dışında bırakmak istediğinizde -prune kullanırsınız. Özellikle kök dizinden arama yaparken /proc ve /sys gibi sanal dosya sistemlerini atlamak önemlidir.

# /proc ve /sys dizinlerini atlayarak ara
find / -path "/proc" -prune -o -path "/sys" -prune -o -name "*.conf" -print

# node_modules dizinlerini atlayarak JavaScript dosyalarını bul
find /var/www -path "*/node_modules" -prune -o -name "*.js" -print

# .git dizinlerini atlayarak ara
find /home/dev -name ".git" -prune -o -type f -name "*.py" -print

Pratik Sysadmin Senaryoları

Senaryo 1: Disk Temizliği

# 90 günden eski backup dosyalarını listele ve sil
find /backup -name "*.tar.gz" -mtime +90 -ls
find /backup -name "*.tar.gz" -mtime +90 -delete

# Boş dosyaları bul ve temizle
find /var/log -type f -empty -delete

# Core dump dosyalarını temizle
find / -name "core" -type f -mtime +7 -delete 2>/dev/null

Senaryo 2: Güvenlik Denetimi

# Son 24 saatte değiştirilen sistem dosyaları
find /etc /usr/bin /usr/sbin -mtime -1 -type f 2>/dev/null

# 777 izinli tehlikeli dosyalar
find /var/www /home -perm 777 -type f 2>/dev/null

# SUID/SGID dosyalarını raporla ve kaydet
find / ( -perm -4000 -o -perm -2000 ) -type f 2>/dev/null > /root/suid_sgid_rapor.txt

Senaryo 3: Log Rotasyonu ve Arşivleme

# 7 günden eski logları sıkıştır
find /var/log -name "*.log" -mtime +7 -exec gzip {} ;

# 30 günden eski sıkıştırılmış logları arşive taşı
find /var/log -name "*.gz" -mtime +30 -exec mv {} /archive/logs/ ;

# Belirli boyutun üzerindeki aktif logları raporla
find /var/log -name "*.log" -size +100M -exec ls -lh {} ;

Senaryo 4: Toplu Dosya İşlemleri

# Tüm .conf dosyalarını yedekle
find /etc -name "*.conf" -exec cp {} /backup/conf_backup/ ;

# Dosyaların MD5 hash'lerini hesapla (integrity check)
find /usr/bin -type f | xargs md5sum > /root/usr_bin_checksums.md5

# Tüm PHP dosyalarının sahipliğini düzelt
find /var/www/html -name "*.php" -exec chown www-data:www-data {} +

Performans İpuçları

Büyük dosya sistemlerinde find kullanırken performansı artıracak birkaç ipucu:

  • Arama dizinini daraltın: Mümkün olduğunca spesifik başlangıç dizini belirtin, kök dizinden başlamak zorunda değilseniz başlamayın.
  • -maxdepth kullanın: Kaç seviye derinliğe inmanız gerektiğini biliyorsanız belirtin, gereksiz ağaç gezmesini önler.
  • Koşul sıralaması önemli: En kısıtlayıcı koşulu öne alın. Örneğin -name "*.log" ile -mtime +30 birlikte kullanıyorsanız, hangi koşulun daha az dosya eleyeceğini düşünün.
  • -exec ... + kullanın: ; yerine + kullanmak çok sayıda dosyada çarpıcı hız farkı yaratır.
  • 2>/dev/null ekleyin: Permission denied hatalarını bastırmak hem çıktıyı temizler hem de yavaşlamayı önler.
# Optimize edilmiş kullanım örneği
find /var -maxdepth 3 -name "*.log" -mtime +30 -type f -exec rm {} + 2>/dev/null

Sonuç

find komutu, Linux sistem yönetiminde her gün başvurduğunuz temel araçlardan biri. Basit dosya aramasından başlayıp, güvenlik denetimine, toplu dosya işlemlerine ve otomatik temizlik görevlerine kadar geniş bir kullanım alanı sunuyor. Bu rehberde ele aldığımız seçenekleri ve senaryoları pratiğe döktükçe, hangi durumda hangi kombinasyonu kullanacağınız konusunda iyi bir sezgi geliştirirsiniz.

Özellikle -exec ve xargs kombinasyonlarını iyi kavramak, sizi tekrarlayan manuel işlemlerden kurtarır. Büyük sistemlerde disk yönetimi, güvenlik kontrolü ve toplu dosya operasyonları için find komutunu cron job’larla birleştirerek otomasyonun kapılarını açabilirsiniz.

Son olarak kritik bir hatırlatma: -delete veya rm ile silme işlemi yapmadan önce mutlaka önce sadece listeleme yapın, ne sileceğinizi gözden geçirin. “Önce listele, sonra sil” prensibini hiç aklınızdan çıkarmayın. Bir kere silinen verinin geri gelmesi çoğu zaman mümkün olmaz.

Yorum yapın