次のコマンドを実行していますが、再帰的に実行されません。
find . -name *.Java
現在のディレクトリのさらに下にJavaファイルがあることを知っていますが、現在のディレクトリでのみfind
を実行しています。OSX 10.9を使用しています。
問題は、-name
パラメータを引用していないことです。代わりにこれを行ってください:
find . -name '*.Java'
説明
引用符がないと、シェルは*.Java
をグロブパターンとして解釈し、グロブに一致するすべてのファイル名に展開してから、find
に渡します。このように、たとえば、現在のディレクトリにfoo.Java
がある場合、find
の実際のコマンドラインは次のようになります。
find . -name foo.Java
これは明らかに現在のディレクトリにあるファイルのみを一覧表示します(ツリーの下の方に同じような名前のファイルがある場合は除きます)。
クォートはグロブの展開を防ぎ、コマンドラインをfind
にそのまま渡します。
ちなみに、グロブが一致しなかった場合(現在のディレクトリに*.Java
ファイルがない場合)、シェルは、一致しないグロブを処理するように設定されている方法に応じて、2つの動作のいずれかになります(これは管理されます)たとえば、Bashのnullglob
オプションによって):
find
は(偶然にも気をつけて)正しい動作をします。find
は-name
への引数がないと文句を言います。-name値を引用符で囲んでいるのと同じような状況でしたが、期待していた検索ヒットのすべてがまだ取得されていませんでした。私はそれがシンボリックリンクのせいであると推測しました、そして確かにそれは事実でした。 findにシンボリックリンクを強制的に検索させたい場合は、コマンドを次のように変更できます。
find -L . -name '*.Java'
エスケープ*
find . -name \*.Java