Dosya Eşleştirmede Ustalaşmak: Shell Betiklemesinde Glob
ve Find
Komutlarını Kullanma
Shell betiklemesi ve dosya yönetimi konusunda derinleştikçe karşılaşılan ortak bir soru vardır: Mevcut dizindeki ve tüm alt dizinlerdeki dosyaları eşleştiren bir glob oluşturmak mümkün müdür? Dosya yollarını verimli bir şekilde yönetmek bazen zor olabilir, özellikle de sadece mevcut çalışma dizinindeki dosyaları değil, aynı zamanda yapılandırılmış klasör hiyerarşisinin derinliklerinde bulunan dosyaları da kapsamak istiyorsanız.
Bu blog yazısında, varsayımsal bir dizinin yapısını keşfedeceğiz ve dosyaları glob
desenleri ve çok yönlü find
komutunu kullanarak nasıl eşleştirebileceğimizi göstereceğiz. Yazının sonunda, bu araçlarla dosya arama işlemlerini daha rahat bir şekilde yapabileceksiniz.
Dizin Yapısını Anlamak
Üzerinde çalıştığımız dizin yapısına biraz daha yakından bakalım:
.
|-- README.txt
|-- firstlevel.rb
`-- lib
|-- models
| |-- foo
| | `-- fourthlevel.rb
| `-- thirdlevel.rb
`-- secondlevel.rb
Bu yapıda dosyalar ve klasörlerin bir karışımını görüyoruz:
- Dosyalar:
README.txt
firstlevel.rb
secondlevel.rb
thirdlevel.rb
(içindelib/models
)fourthlevel.rb
(içindelib/models/foo
)
Amaç: Mevcut dizindeki ve tüm alt dizinlerindeki .rb
dosyalarını eşleştirmek.
Çözüm: find
Komutunu Kullanma
Dosyalarınızı tanımlamak için bir glob
kullanmayı düşünebilirsiniz, ancak find
komutunu kullanmak genellikle esnekliği ve gücü nedeniyle tercih edilen bir yöntemdir. Komutunuzu nasıl yapılandırabileceğinizi göralım:
find . -name '*.rb' -type f
Komutu Parçalayarak Anlamak
find
: Bu, yollar üzerinden arama başlatan komuttur..
: Aramanın başlangıç noktası olarak mevcut dizini belirtir.-name '*.rb'
: Bu seçenek,find
komutuna*.rb
desenine uyan dosyaları aramasını söyler - yani.rb
uzantısına sahip herhangi bir dosya.-type f
: Sadece dosyaların eşleşeceğini, dizinlerin sonuçlardan hariç tutulacağını garanti eder.
find
Kullanmanın Faydaları
- Esneklik: Karmaşık dizin yapılarıyla başa çıkmakta zorlanan
glob
‘un aksine,find
tüm alt dizin seviyelerinde sorunsuz bir şekilde geçiş yapabilir. - Ekstra Seçenekler: Değiştirme zamanı, boyut gibi çeşitli diğer parametrelerle aramanızı geliştirebilirsiniz.
- Performans:
find
kullanmak, genellikle daha büyük dizin ağaçlarında daha verimli olup, dosyaları bulurken daha hızlı performans sağlar.
Alternatif Yaklaşım: Glob Desenleri Kullanma
find
kullanmak önerilse de, doğrudan bir glob yaklaşımını da kullanabilirsiniz. Ancak, karmaşık yapıları globerle yönetmenin zorlaşabileceğini ve daha az okunabilir hale gelebileceğini belirtmek önemlidir. İşte basit bir glob deseninin nasıl kullanılabileceğine dair temel bir örnek:
echo **/*.rb
Bu komut, **
deseninden faydalanır; bu desen, extend globbing (örneğin shopt -s globstar
ile bash
gibi) destekleyen bir shell içinde tüm dizinlerde rekürsif olarak glob yapmaya olanak tanır.
Glob Desenlerinin Sınırlamaları
- Karmaşıklık: Yapı karmaşık olduğunda, glob desenleri okumakta ve sürdürmekte zorlayıcı hale gelebilir.
- Uyumluluk: Tüm shell’ler genişletilmiş globbing’i desteklemez, bu da ortamlar arasında tutarsız davranışlara yol açabilir.
Sonuç
Özetle, mevcut dizininizdeki ve alt dizinlerinizdeki dosyaları eşleştirmek için glob
desenlerini kullanmak mümkün olsa da, find
komutu shell betikleme ihtiyaçlarınız için çok daha güçlü bir çözüm sunan sağlam ve esnek bir araçtır.
Aşağıdaki komutu kullanarak:
find . -name '*.rb' -type f
belirtilen dizin yapısı içinde tüm eşleşen .rb
dosyalarını etkili bir şekilde çıktılarınızda gösterir, dosya yönetim süreçlerinizi kolaylaştırır.
Bu komutları ustalıkla kullanarak, shell ortamınızdaki dosyaları gezinme ve yönetim etkinliğinizi artırabilirsiniz.