Bulmam neden özyinelemeli değil?


65

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.


@Gilles: Bu soru-cevap, dupe'den çok daha net ve daha az yerelleştirilmiş - eğer biri kapalıysa diğeri.
goldilocks

Yanıtlar:


88

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):

  1. Eşleşmeyen bir küre kabuk tarafından genişlemezse find, (yanlışlıkla, dikkat etmeniz gereken) doğru davranış sergileyecektir.
  2. Eşleşmeyen bir glob kabuk tarafından boş bir dizgeye genişletilirse, findbir argüman eksik olduğundan şikayet edecektir -name.

20

-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'

Symlinks de benim sorunumdu. diğer paramların önüne koyduğunuz sürece, -followdaha okunaklı bir eşanlamlı -L.
Noumenon

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.