照会が再帰的ではないのはなぜですか?

照会が再帰的ではないのはなぜですか?

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

find . -name *.java

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

答え1

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

find . -name '*.java'

説明する

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

find . -name foo.java

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

引用はグローバル拡張を防ぎ、findコマンドラインをそのまま渡します。

しかし、globを一致させることができない場合(*.java現在のディレクトリにファイルがありません)、一致しないglobを処理するようにシェルを設定する方法に応じて、2つの動作のうちの1つが得られます(nullglobBashのオプションで制御されます)。

  1. シェルが一致しない glob を拡張しない場合find(予期せず)、正しい動作を示します。
  2. シェルが一致しないglobを空の文字列に拡張すると、不足しているとfind文句を言います-name

答え2

-name 値を引用符で囲んだが、まだ私が期待していた検索結果をすべて取得できないような状況が発生しました。私はそれがシンボリックリンクのためだと推測し、確かにそうでした。 findをシンボリックリンクで強制的に検索するには、コマンドを次のように変更します。

find -L . -name '*.java'

答え3

逃げる*

find . -name \*.java

関連情報