なぜ私のfindは再帰的ではないのですか?


65

次のコマンドを実行していますが、再帰的に実行されません。

find . -name *.java

私は現在のディレクトリにさらにJavaファイルがあることを知っていますがfind、現在のディレクトリでのみ実行しています。OS X 10.9を使用しています。


@Gilles:このQ&Aは、Dupeよりもはるかに明確でローカライズされていません-それらの1つを閉じる必要がある場合、それはもう1つです。
ゴルディロックス

回答:


88

問題は、-nameパラメーターを引用していないことです。代わりにこれを行います:

find . -name '*.java'

説明

引用符がないと、シェル*.javaはglobパターンとして解釈し、globに渡す前に、globに一致する任意のファイル名に展開しますfind。この方法で、たとえばfoo.java現在のディレクトリにある場合、find実際のコマンドラインは次のようになります。

find . -name foo.java

これは明らかに、現在のディレクトリのみにファイルをリストします(ツリーのさらに下にいくつかの同様の名前のファイルがある場合を除く)。

引用符は、グロブの展開を防ぎ、コマンドラインをfindそのまま渡します。

ちなみに、グロブが一致しなかった*.java場合(現在のディレクトリにファイルがない場合)、一致しないグロブを処理するようにシェルを設定する方法に応じて、2つの動作のいずれかが発生します(これはnullglobBash のオプションによって管理されます、 例えば):

  1. 一致しないグロブがシェルによって展開されない場合、find(偶然、気になります)正しい動作を示します。
  2. 一致しないグロブがシェルによって空の文字列に展開されると、findへの引数が欠落していると文句を言います-name

20

-nameの値を引用符で囲んでいるような状況がありましたが、それでも期待した検索ヒットがすべて得られませんでした。私はそれがシンボリックリンクのせいだと推測し、確かにそうでした。findにシンボリックリンクを強制的に検索させる場合は、コマンドを次のように変更できます。

find -L . -name '*.java'

シンボリックリンクも私の問題でした。他のparamsの前に置く限り、-followはのより読みやすい同義語です-L
ヌメノン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.