Aşağıdaki komutu çalıştırıyorum, ancak yinelemeli olarak gerçekleştirilemiyor:
find . -name *.java
Geçerli dizinde daha fazla java dosyası olduğunu biliyorum, ancak findyalnızca geçerli dizinde gerçekleştiriliyor . OS X, 10.9 kullanıyorum.
Aşağıdaki komutu çalıştırıyorum, ancak yinelemeli olarak gerçekleştirilemiyor:
find . -name *.java
Geçerli dizinde daha fazla java dosyası olduğunu biliyorum, ancak findyalnızca geçerli dizinde gerçekleştiriliyor . OS X, 10.9 kullanıyorum.
Yanıtlar:
Sorun şu ki, -nameparametrenizi teklif etmediniz. Bunu yerine yapın:
find . -name '*.java'
açıklama
Tırnaklar olmadan, kabuk *.javabir küre kalıbı olarak yorumlanır ve onu geçmeden önce küre ile eşleşen dosya adlarına genişletir find. Bu yolla, eğer foo.javageçerli dizinde findolsaydınız , gerçek komut satırı şöyle olurdu:
find . -name foo.java
Açıkçası sadece geçerli dizindeki dosyayı listeleyecek (Ağacın aşağısında benzer şekilde adlandırılmış dosyalara sahip olmadıkça).
Alıntılama, glob genişlemesini önler ve komut satırını olduğu findgibi iletir .
Bu arada, eğer dünya eşleşmediyse ( *.javamevcut dizinde dosya yoksa ), kabuğunuzun eşleşmeyen dünyalarla başa çıkmak için nasıl ayarlandığına bağlı olarak iki davranıştan birini elde edersiniz (bu, Bash’deki nullglobseçenektir. , Örneğin):
find, (yanlışlıkla, dikkat etmeniz gereken) doğru davranış sergileyecektir.findbir argüman eksik olduğundan şikayet edecektir -name.-Ad değerini tırnak işaretleri içine aldığım yerlere benzer bir durum vardı, ancak umduğum tüm isabetleri alamadım. Bunun, sembolik bağlar yüzünden olduğunu ve durumun yeterince doğru olduğuna kanaat getirdim. Bulguyu sembolik bağlar arasında aramaya zorlamak istiyorsanız, komutu aşağıdaki gibi değiştirebilirsiniz:
find -L . -name '*.java'
-followdaha okunaklı bir eşanlamlı -L.
Kaçış *
find . -name \*.java