我一直在使用 zsh globbing 来执行以下命令:
vim **/filename
vim *.html.erb
依此类推,但是当我输入以下内容时:
find . -name *mobile*
我得到回应:
zsh: no matches found: *mobile*
为什么?
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。
事实证明,解决问题所需要做的就是在输入周围添加一些引号:
find . -name '*mobile*'
对于为什么我还没有真正的答案……而且文档中也没有什么让我印象深刻的东西,但是如果您知道答案,请告诉我!