web-dev-qa-db-ja.com

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

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

find . -name *.Java

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

69
user11498

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

find . -name '*.Java'

説明

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

find . -name foo.Java

これは明らかに現在のディレクトリにあるファイルのみを一覧表示します(ツリーの下の方に同じような名前のファイルがある場合は除きます)。

クォートはグロブの展開を防ぎ、コマンドラインをfindにそのまま渡します。

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

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

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

find -L . -name '*.Java'
23
gaoagong

エスケープ*

find . -name \*.Java
0
Stuart Cardall