我一直在使用zsh globbing命令,例如:
vim**/filename vim *.html.erb
等等,但是当我输入类似于:
find . -name *mobile*
我得到的回应是:
zsh: no matches found: *mobile*
为什么?
cld4siwp1#
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将查找任何包含字符串“移动的”的文件名。这里需要注意的重要一点是,zsh和find都支持相同的通配符语法,但在本例中您希望find处理通配符,而不是zsh。
i7uaboj42#
事实证明,要解决这个问题,您只需在输入的前后加上一些引号:
find . -name '*mobile*'
我真的没有一个答案,为什么只是还没有...和文档没有一个东西,坚持到我,但让我知道,如果你知道答案!
x9ybnkn63#
出于存档的目的,这里是我对@Swiss的回复进行的实质性编辑/重新格式化。每次我试图编辑时,编辑队列都已满,长达数小时,所以我想保留此内容以供将来参考。我希望它被认为是有建设性的。说得很清楚,这是对另一个人的作品的修改。
在第一种情况下,不带单引号,zsh将按如下方式处理:
mobile.1
find
因此,find将只查找名为mobile.1的文件。在第二种形式中,加上单引号,整个glob将被保留并传递给find:
这意味着find将查找任何包含字符串“移动的”的文件名。这里需要注意的重要一点是,zsh和find都支持相同的通配符语法;通过使用单引号,可以引导find处理通配符,而不是处理zsh。
3条答案
按热度按时间cld4siwp1#
与
不同之处在于shell在分析行时所执行的步骤。通常,shell在运行命令之前展开它找到的任何通配符。但是,单引号将参数标记为文字,这意味着shell在运行命令之前不会对该参数执行通配符展开。
为了演示差异,假设您位于包含以下文件的目录中:
zsh会在运行第一个表单之前将其展开为以下格式:
这意味着find将只查找名为mobile的文件。1
第二个表单将按如下方式运行:
这意味着find将查找任何包含字符串“移动的”的文件名。
这里需要注意的重要一点是,zsh和find都支持相同的通配符语法,但在本例中您希望find处理通配符,而不是zsh。
i7uaboj42#
事实证明,要解决这个问题,您只需在输入的前后加上一些引号:
我真的没有一个答案,为什么只是还没有...和文档没有一个东西,坚持到我,但让我知道,如果你知道答案!
x9ybnkn63#
出于存档的目的,这里是我对@Swiss的回复进行的实质性编辑/重新格式化。每次我试图编辑时,编辑队列都已满,长达数小时,所以我想保留此内容以供将来参考。我希望它被认为是有建设性的。
说得很清楚,这是对另一个人的作品的修改。
与
不同之处在于shell在分析行时所执行的步骤。通常,shell在运行命令之前展开它找到的任何通配符。但是,单引号将参数标记为文字,这意味着shell在运行命令之前不会对该参数执行通配符展开。
为了演示差异,假设您位于包含以下文件的目录中:
在第一种情况下,不带单引号,zsh将按如下方式处理:
mobile.1
(因为这是当前目录中唯一匹配的文件名find
,因此:因此,
find
将只查找名为mobile.1的文件。在第二种形式中,加上单引号,整个glob将被保留并传递给
find
:这意味着find将查找任何包含字符串“移动的”的文件名。
这里需要注意的重要一点是,zsh和find都支持相同的通配符语法;通过使用单引号,可以引导find处理通配符,而不是处理zsh。