# Bash’te Belirli Bir Desene Uyan Tüm Dosyaları Listeleme
Bir Linux sisteminde yüzlerce, belki binlerce dosya arasında belirli bir kritere uyanları bulmak zorunda kaldığınızı düşünün. Bu dosyaların isimlerinde ortak bir özellik var, örneğin “.log” uzantısı veya “rapor_” ön eki. İşte bu noktada Bash’in güçlü dosya eşleştirme yetenekleri devreye giriyor. Bu makalede, Bash kullanarak belirli bir desene uyan tüm dosyaları listelemeyi adım adım öğrenecek, gerçek dünya örnekleri ve performans optimizasyon teknikleriyle uzman seviyesine ulaşacaksınız.
Öğrenme Yol Haritası:
* Yeni Başlayan: find ve ls komutlarının temel kullanımı, basit kod örnekleri.
* Orta Seviye: Gerçek hayat senaryoları, glob karakterlerinin kullanımı, performans optimizasyon ipuçları.
* İleri Seviye: Performans analizi, karmaşık desen eşleştirme, regex kullanımı, edge case’ler.
1. Temel Kavramlar: ls ve find Komutları
Bash’te dosya listeleme için en yaygın kullanılan iki komut ls ve find‘dır. ls komutu, mevcut dizindeki dosyaları listelerken, find komutu, belirli bir dizin altında ve alt dizinlerinde dosya arama işlemi için daha güçlü ve esnek bir seçenektir.
ls komutu, wildcard karakterleri (yıldız işareti * ve soru işareti ?) kullanarak desen eşleştirme sağlar. *, sıfır veya daha fazla karakteri, ? ise tek bir karakteri temsil eder. Örneğin:
ls *.txt # Tüm .txt uzantılı dosyaları listeler
ls rapor_*.pdf # rapor_ ile başlayan ve .pdf uzantılı dosyaları listeler
ls ??.jpg # İki karakterli isimli ve .jpg uzantılı dosyaları listeler
Ancak ls komutu, alt dizinleri taramaz. Alt dizinleri de dahil olmak üzere belirli bir desenle eşleşen dosyaları bulmak için find komutu kullanılır.
2. Nasıl find Komutunu Kullanırım? Dosya Bulmanın Temelleri
find komutu, belirtilen dizini ve alt dizinlerini yineleyerek, verilen kriterlere uyan dosyaları bulur. Temel kullanım şu şekildedir:
find <başlangıç_dizin> <opsiyonlar> <eşleştirme_deseni>
Örneğin, /var/log dizini altında tüm .log dosyalarını bulmak için:
find /var/log -name "*.log"
Burada:
* /var/log: Aramanın başlayacağı dizin.
* -name "*.log": .log ile biten dosyaları arayacağımızı belirtir. -name seçeneği, dosya adını tam olarak eşleştirir. Wildcards kullanabilirsiniz.
Daha fazla seçenek için man find komutunu kullanabilirsiniz. find komutu oldukça güçlüdür ve birçok seçenek sunar.
3. Gerçek Hayatta find ve ls Kullanımı: Vaka Analizleri
Vaka 1: Yedekleme Dosyalarını Bulma:
Bir web sunucusunda, her gün oluşturulan yedekleme dosyalarını (backup_YYYYMMDD.tar.gz) bulmamız gerekiyor.
find /backup -name "backup_*.tar.gz"
Bu komut, /backup dizini altında ve alt dizinlerinde “backup_” ile başlayan ve “.tar.gz” ile biten tüm dosyaları listeler.
Vaka 2: Belirli Bir Tarihte Oluşturulan Dosyaları Bulma:
Geçen hafta oluşturulan tüm .txt dosyalarını bulmak için -mtime seçeneğini kullanabiliriz. -mtime +7 yedi günden daha eski dosyaları, -mtime -7 ise yedi günden daha yeni dosyaları gösterir.
find . -name "*.txt" -mtime -7
Vaka 3: Belirli Bir Boyuttaki Dosyaları Bulma:
10 MB’tan büyük tüm dosyaları bulmak için -size seçeneğini kullanabiliriz.
find . -size +10M
4. Glob Karakterleri ile Gelişmiş Dosya Eşleştirme
* ve ? wildcard’larının yanı sıra, daha gelişmiş desen eşleştirme için [] karakter aralıklarını ve {} kümelerini kullanabiliriz.
* [abc] : a, b veya c karakterlerinden birini içeren dosya adlarını eşleştirir.
* [a-z] : Küçük harflerden oluşan bir karakter aralığını eşleştirir.
* [0-9] : Rakamlardan oluşan bir karakter aralığını eşleştirir.
* {dosya1,dosya2,dosya3} : dosya1, dosya2 veya dosya3 adlı dosyaları eşleştirir.
Örnek:
ls [0-9]*.txt # Rakamla başlayan ve .txt uzantılı dosyaları listeler
ls report_{20231026,20231027}.csv # Belirli tarihli raporları listeler
5. Performans Optimizasyonu: find Komutunu Hızlandırma
find komutu büyük dizinlerde çalışırken yavaşlayabilir. Performansı artırmak için aşağıdaki ipuçlarını kullanabilirsiniz:
* -prune seçeneği: İstenmeyen dizinleri aramadan atlamak için kullanılır. Örneğin, /tmp dizinini aramadan atlamak için:
find / -name "*.log" -path "/tmp/*" -prune -o -print
* -maxdepth seçeneği: Aramanın derinliğini sınırlamak için kullanılır. Örneğin, sadece birinci düzey alt dizinleri aramak için:
find . -maxdepth 1 -name "*.log"
* -type seçeneği: Sadece belirli dosya türlerini aramak için kullanılır. Örneğin, sadece dosyaları aramak için:
find . -type f -name "*.log"
* xargs ile birleştirme: find komutunun çıktısını başka bir komutun girdisi olarak kullanmak için xargs kullanabilirsiniz. Bu, özellikle çok sayıda dosya üzerinde işlem yaparken performansı artırabilir. Örneğin, tüm .log dosyalarını gzip ile sıkıştırmak için:
find . -name "*.log" -print0 | xargs -0 gzip
6. İleri Düzey Teknikler: Düzenli İfadeler (Regex)
find komutu, düzenli ifadeleri doğrudan desteklemez, ancak -regex seçeneği kullanılabilir. Ancak -regex seçeneği, tam dosya yolunu eşleştirir, sadece dosya adını değil. Bu nedenle, daha karmaşık eşleştirmeler için grep komutu ile birlikte kullanılabilir.
find . -type f -print0 | xargs -0 grep -E "pattern"
Bu komut, tüm dosyaları tarayıp belirli bir düzenli ifadeye uyan satırları bulur.
7. Edge Case’ler ve Hata Ayıklama
find komutu ile çalışırken, bazı beklenmedik durumlarla karşılaşabilirsiniz. Örneğin, dosya adlarında özel karakterler (boşluk, $, &, vb.) bulunabilir. Bu durumlarda, -print0 ve xargs -0 seçeneklerini kullanarak bu sorunları önleyebilirsiniz.
8. Sonuç
Bu makalede, Bash kullanarak belirli bir desene uyan dosyaları listeleme konusunda yeni başlayanlardan uzman seviyesine kadar bir yol haritası sunduk. ls ve find komutlarının temel kullanımından, gelişmiş desen eşleştirme tekniklerine ve performans optimizasyonuna kadar birçok konuyu ele aldık. Gerçek dünya senaryolarıyla desteklenen örnekler ve ipuçlarıyla, artık Bash’in dosya yönetimi yeteneklerini daha etkin bir şekilde kullanabilirsiniz.
Sıkça Sorulan Sorular:
1. find komutu çok yavaş çalışıyor, ne yapabilirim? Performans optimizasyon bölümünde belirtilen ipuçlarını deneyin (-prune, -maxdepth, -type, xargs).
2. Dosya adlarında boşluk varsa ne olur? -print0 ve xargs -0 seçeneklerini kullanın.
3. find komutu hangi karakterleri wildcard olarak kabul eder? *, ?, [], {} karakterleri.
4. Düzenli ifadeler nasıl kullanılır? grep komutu ile birlikte find komutunu kullanın.
5. find komutunun tüm seçeneklerini nasıl görebilirim? man find komutunu çalıştırın.
Yazar: Fatih Soysal