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 find
yalnı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 find
yalnızca geçerli dizinde gerçekleştiriliyor . OS X, 10.9 kullanıyorum.
Yanıtlar:
Sorun şu ki, -name
parametrenizi teklif etmediniz. Bunu yerine yapın:
find . -name '*.java'
açıklama
Tırnaklar olmadan, kabuk *.java
bir 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.java
geçerli dizinde find
olsaydı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 find
gibi iletir .
Bu arada, eğer dünya eşleşmediyse ( *.java
mevcut 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 nullglob
seçenektir. , Örneğin):
find
, (yanlışlıkla, dikkat etmeniz gereken) doğru davranış sergileyecektir.find
bir 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'
-follow
daha okunaklı bir eşanlamlı -L
.
Kaçış *
find . -name \*.java