次のコマンドを実行していますが、再帰的には実行されません。
find . -name *.java
私は現在のディレクトリにjavaファイルもあることを知っていますが、find
現在のディレクトリでのみ実行されます。私はOS X 10.9を使用しています。
答え1
問題は、パラメータを引用しないことです-name
。代わりにこれを行う:
find . -name '*.java'
説明する
引用符がない場合、シェルはそれを*.java
globパターンとして解釈し、に渡す前にglobと一致するファイル名に展開しますfind
。このようにしてfoo.java
現在のディレクトリにある場合、実際find
のコマンドラインは次のようになります。
find . -name foo.java
明らかに、これは現在のディレクトリのファイルのみをリストします(ツリーの下に同じ名前のファイルがある場合を除く)。
引用はグローバル拡張を防ぎ、find
コマンドラインをそのまま渡します。
しかし、globを一致させることができない場合(*.java
現在のディレクトリにファイルがありません)、一致しないglobを処理するようにシェルを設定する方法に応じて、2つの動作のうちの1つが得られます(nullglob
Bashのオプションで制御されます)。
- シェルが一致しない glob を拡張しない場合
find
(予期せず)、正しい動作を示します。 - シェルが一致しないglobを空の文字列に拡張すると、不足していると
find
文句を言います-name
。
答え2
-name 値を引用符で囲んだが、まだ私が期待していた検索結果をすべて取得できないような状況が発生しました。私はそれがシンボリックリンクのためだと推測し、確かにそうでした。 findをシンボリックリンクで強制的に検索するには、コマンドを次のように変更します。
find -L . -name '*.java'
答え3
逃げる*
find . -name \*.java