次のコマンドを実行していますが、再帰的に実行されません:
find . -name *.java
現在のディレクトリのさらに下にJavaファイルがあることは知っていますが、現在のディレクトリでのみfind
を実行しています。 OS X、10.9を使用しています。
回答
問題は、パラメータ。代わりにこれを実行してください:
find . -name "*.java"
説明
引用符がない場合、シェルは*.java
をglobパターンとして解釈し、globに一致するファイル名に展開してから渡します。 find
に移動します。このように、たとえば、現在のディレクトリにfoo.java
がある場合は、find
の実際のコマンドラインは次のようになります。
find . -name foo.java
これは明らかに現在のディレクトリにあるファイルのみを一覧表示します(同じような名前のファイルがある場合を除く)
引用すると、globの拡張が防止され、コマンドラインがそのままfind
に渡されます。
ちなみに、 globが一致しませんでした(現在のディレクトリに*.java
ファイルがありませんtory)、一致しないグロブを処理するようにシェルがどのように設定されているかに応じて、2つの動作のいずれかが得られます(これは、たとえば、Bashのnullglob
オプションによって制御されます):
- 一致しないグロブがシェルによって展開されない場合、
find
は(偶然にも)正しい動作を示します。 - 一致しないグロブがシェルによって空の文字列に展開された場合、
find
は-name
。
回答
私が周囲にいたのと同じような状況がありました。 -引用符で値を指定しますが、それでも私が期待していたすべての検索ヒットを取得できませんでした。シンボリックリンクのせいだと推測しましたが、確かにそうだったのです。検索でシンボリックリンクを検索するように強制する場合は、コマンドを次のように変更できます。
find -L . -name "*.java"
コメント
回答
*
find . -name \*.java
-follow
は、他のパラメーターの前に置く限り、-L
のより読みやすい同義語です。