unix 为什么zsh globbing不能与find命令一起使用?

wfauudbj  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(159)

我一直在使用zsh globbing命令,例如:

vim**/filename
 vim *.html.erb

等等,但是当我输入类似于:

find . -name *mobile*

我得到的回应是:

zsh: no matches found: *mobile*

为什么?

cld4siwp

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 . -name *mobile*

这意味着find将查找任何包含字符串“移动的”的文件名。
这里需要注意的重要一点是,zsh和find都支持相同的通配符语法,但在本例中您希望find处理通配符,而不是zsh。

i7uaboj4

i7uaboj42#

事实证明,要解决这个问题,您只需在输入的前后加上一些引号:

find . -name '*mobile*'

我真的没有一个答案,为什么只是还没有...和文档没有一个东西,坚持到我,但让我知道,如果你知道答案!

x9ybnkn6

x9ybnkn63#

出于存档的目的,这里是我对@Swiss的回复进行的实质性编辑/重新格式化。每次我试图编辑时,编辑队列都已满,长达数小时,所以我想保留此内容以供将来参考。我希望它被认为是有建设性的。
说得很清楚,这是对另一个人的作品的修改。

find . -name *mobile* # does not work

find . -name '*mobile*' # works

不同之处在于shell在分析行时所执行的步骤。通常,shell在运行命令之前展开它找到的任何通配符。但是,单引号将参数标记为文字,这意味着shell在运行命令之前不会对该参数执行通配符展开。
为了演示差异,假设您位于包含以下文件的目录中:

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

在第一种情况下,不带单引号,zsh将按如下方式处理:

  • 展开glob,只呈现mobile.1(因为这是当前目录中唯一匹配的文件名
  • 将结果传递给find,因此:
find . -name mobile.1

因此,find将只查找名为mobile.1的文件。
在第二种形式中,加上单引号,整个glob将被保留并传递给find

find . -name *mobile*

这意味着find将查找任何包含字符串“移动的”的文件名。
这里需要注意的重要一点是,zsh和find都支持相同的通配符语法;通过使用单引号,可以引导find处理通配符,而不是处理zsh。

相关问题