23

我一直在使用 zsh globbing 来执行以下命令:

 vim **/filename
 vim *.html.erb

依此类推,但是当我输入以下内容时:

 find . -name *mobile*

我得到回应:

 zsh: no matches found: *mobile*

为什么?

4

2 回答 2

53
find . -name *mobile* # does not work

对比

find . -name '*mobile*' # works

不同之处在于 shell 在解析行时所采取的步骤。通常,shell 在运行命令之前会扩展它找到的任何通配符。但是,单引号将参数标记为文字,这意味着 shell 在运行命令之前不会对该参数执行通配符扩展。

为了演示差异,假设您位于包含以下文件的目录中:

$ tree
./
mobile.1
dir/
    mobile.2

zsh 在运行前会将第一个表单扩展为以下形式:

find . -name mobile.1

这意味着 find 只会查找字面上命名为 mobile.1 的文件

第二种形式将按如下方式运行:

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 回答