質問: 環境 Ubuntu16.4 下記コマンドの挙動があまりにも違いすぎるので教えて下さい。 "y"*は、yで始まるファイルが1件存在するので、確かに、1件検索されます。 "y*"をすると、ディレクトリ配下にあるyが含まれるファイルが大量にずらずらと検索されてします。 ``` $find ./ -name "y"* $find ./ -name "y*" ``` 違いが余り分かっていないのですが、どなたか教えて下さい。
回答: findコマンドの`-name`オプションに指定するファイル名パターンは、「findが検索するディレクトリ上で探してほしいファイル名」を指定しますよね。 `"y"*`と指定すると、findを実行するさいにシェルがカレントディレクトリにある「yで始まるファイル名」に置換してからfindが実行されます。 たとえば、カレントディレクトリに「yes」というファイルがあれば、検索先のディレクトリから「yes」というファイル名を持つファイルを探すことになります。 補足: 運良く"y"*にマッチするファイルがカレントディレクトリに存在しなければ(*が展開されないため)結果は`"y*"`と同じになります。また、複数のファイルがマッチした場合は、findの引数に複数のファイル名が割り込むことになるので、文法エラーになるか思わぬ結果になるでしょう。 いっぽう、`"y*"`と指定すると、シェルによる置換は行なわれずに、「y*」がそのままfindに渡されてfindが実行されます。 すると、検索先のディレクトリから、「y*」にマッチするファイル名を持つファイルを探すことになります。 結論: findで`-name`を使うときは、必ずクオートすること。