Neden find
Beklenen Sonuçları Döndürmüyor? İşte Bunu Nasıl Düzeltirsiniz
Eğer Unix tabanlı sisteminizde find
komutunu hiç çalıştırdıysanız, dosyaların bulunduğundan emin olmanıza rağmen komutun dosyaları bulamadığı can sıkıcı bir durumla karşılaşmış olabilirsiniz. Örneğin, shell betik dosyalarını aramak isteyebilirsiniz ve var olduğundan emin olmanıza rağmen, çıktı boş olabilir. Bu yaygın sorun genellikle find
komutunun joker karakterleri nasıl yorumladığı konusundaki yanlış anlamalardan kaynaklanır. Soruna daha derinlemesine dalalım ve aramanızı tekrar yoluna koyacak çözümleri keşfedelim.
Sorun: find
Beklendiği Gibi Çalışmıyor
Belki de denemiş olduğunuz şu komutu düşünün:
$ find /usr -name *.sh
Bu komut, /usr
dizinindeki .sh
uzantılı tüm dosyaları aramak için tasarlanmıştır. Ancak eğer hiç sonuç görünmüyorsa, Neden find
çalışmıyor? diye düşünebilirsiniz.
Betiklerin orada olduğunu biliyorsunuz; örneğin şu komutu çalıştırdığınızda:
$ ls /usr/local/lib/*.sh
tclConfig.sh
ve tkConfig.sh
gibi dosyaları görebilirsiniz. Peki, find
komutunuzda ne yanlış gidiyor?
Sorunun Anlaşılması
Buradaki ana sorun, komut kabuğunun joker karakter *.sh
‘yi nasıl yorumladığıdır. Özellikle, mevcut dizininizde *.sh
ile eşleşen dosyalar varsa, shell bu joker karakteri genişletecek, böylece find
‘in eyleme geçmesi için fırsat kalmayacaktır. Bu durum beklenmedik davranışlara yol açabilir:
-
Joker Karakter Genişletmesi
- Eğer mevcut dizininizde
.sh
dosyaları varsa, örneğintkConfig.sh
,find /usr -name *.sh
yazdığınızda bu,find /usr -name tkConfig.sh
olarak genişler ve aramanızı sadece o dosya ile sınırlamış olur.
- Eğer mevcut dizininizde
-
Sözdizim Hataları
- Eğer birden fazla dosya eşleşiyorsa,
find
belirsiz argümanlar nedeniyle bir sözdizimi hatası verebilir:find: bad option tkConfig.sh
- Eğer birden fazla dosya eşleşiyorsa,
Çözüm 1: Joker Karakteri Alıntılamak
Shell’in joker karakteri find
‘e geçmeden önce genişletmesini önlemek için joker karakterini alıntılayabilirsiniz:
- İki tırnak kullanarak:
$ find /usr -name "*.sh"
- Ya da tek tırnak kullanarak:
$ find /usr -name '*.sh'
*.sh
‘yi alıntılayarak, shell’e bunu find
‘e olduğu gibi iletmesini söylüyor, böylece belirtilen dizindeki tüm .sh
dosyalarını arayabilir.
Çözüm 2: Sembolik Bağlantıları İzleme
find
‘in beklenildiği gibi çalışmamasının bir diğer olası nedeni, /usr
dizininde veya alt dizinlerinde sembolik bağlantıların varlığıdır. Varsayılan olarak, find
sembolik bağlantıları takip etmez. Bunun böyle olduğunu düşünüyorsanız, -follow
seçeneğini kullanabilirsiniz:
$ find /usr -follow -name '*.sh'
Bu komut, find
‘in sembolik bağlantıları aşmasına ve istenen dosyaları aramasına olanak tanır.
Sonuç
Özetlemek gerekirse, eğer find
komutunu çalıştırdığınızda shell betiklerini ararken beklenen sonuçları alamıyorsanız, bunun muhtemelen joker karakter genişletmesi veya sembolik bağlantıların varlığı nedeniyle olduğunu söyleyebiliriz. Her daim joker karakterlerinizi alıntılamayı unutmayın ve gerekirse -follow
seçeneğini kullanın. Bu stratejileri uygulayarak shell betiklerinizi başarıyla bulabilir ve komut satırı becerilerinizi geliştirebilirsiniz!
İyi Aramalar!
Artık find
komutuyla özgüvenle başa çıkmaya hazırsınız! Herhangi bir sorunuz veya ek sorunlarınız varsa, lütfen aşağıdaki yorumlarda belirtmekten çekinmeyin.