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:

  1. Joker Karakter Genişletmesi

    • Eğer mevcut dizininizde .sh dosyaları varsa, örneğin tkConfig.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.
  2. 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
      

Çö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.