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

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

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

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

おすすめ記事