私は次のようなコマンドにzshグロブを使用しています。
vim **/filename
vim *.html.erb
などですが、次のように入力すると次のようになります。
find . -name *mobile*
応答があります:
zsh: no matches found: *mobile*
なんで?
find . -name *mobile* # does not work
vs
find . -name '*mobile*' # works
違いは、シェルが行を解析するときに実行する手順によるものです。通常、シェルは、コマンドを実行する前に、検出したワイルドカードを展開します。ただし、一重引用符は引数をリテラルとしてマークします。これは、コマンドを実行する前に、シェルがその引数に対してワイルドカード展開を実行しないことを意味します。
違いを示すために、次のファイルがあるディレクトリにいるとします。
$ tree
./
mobile.1
dir/
mobile.2
zshは、実行する前に最初のフォームを次のように展開します。
find . -name mobile.1
つまり、findは文字通りmobile.1という名前のファイルのみを検索します。
2番目のフォームは次のように実行されます。
find . -name *mobile*
つまり、findは文字列「mobile」を含むファイル名を検索します。
ここで注意すべき重要な点は、zshとfindの両方が同じワイルドカード構文をサポートしていることですが、この場合、findはzshではなくワイルドカードを処理する必要があります。
問題を解決するために必要なのは、入力の前後に引用符を追加することだけです。
find . -name '*mobile*'
理由についてはまだ答えがありません...そしてドキュメントには私に突き出るものがありませんが、答えを知っている場合は知らせてください!