23

私は次のようなコマンドにzshグロブを使用しています。

 vim **/filename
 vim *.html.erb

などですが、次のように入力すると次のようになります。

 find . -name *mobile*

応答があります:

 zsh: no matches found: *mobile*

なんで?

4

2 に答える 2

53
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ではなくワイルドカードを処理する必要があります。

于 2012-10-05T21:15:20.910 に答える
4

問題を解決するために必要なのは、入力の前後に引用符を追加することだけです。

find . -name '*mobile*'

理由についてはまだ答えがありません...そしてドキュメントには私に突き出るものがありませんが、答えを知っている場合は知らせてください!

于 2012-10-05T20:54:25.127 に答える