使用带通配符的双引号或无引号

使用带通配符的双引号或无引号

我碰到文章试图解释 find 命令。它给出了一个例子

find /tmp -iname "data*.txt"

现在这篇文章这里指出

双引号不抑制以“$”开头的单词的替换但它们确实抑制了通配符的扩展。

当我尝试这两个命令时

admin@localhost Downloads$ ls
gallifrey-road-doctors-14437-1366x768.jpg  mydir
admin@localhost Downloads$ find . -iname "*gall*"
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname "*gall*"  -----> A
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname *gall*    -----> B
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$

输出似乎是一样的。在什么情况下它们会有所不同?为什么双引号不抑制通配符的扩展A?我的印象是 A 不起作用,只有 B 起作用。

答案1

情况B:

find . -iname *gall*

将展开*gall*为与该模式匹配的所有文件的列表。由于当前目录中只有一个文件与该模式匹配,因此这将变为:

find . -iname gallifrey-road-doctors-14437-1366x768.jpg

...所以 find 将搜索与该确切名称匹配的文件。foo-gallifrey-road-doctors-14437-1366x768.jpg将不会被发现。如果你有两个或多个与 glob 匹配的文件,你最终会得到一个格式错误的 find 命令;我很确定它会因错误而退出。

情况A:

find . -iname "*gall*"

由于引号,shell惯于扩大格局。这就变成了(这就是所find看到的):

find . -iname *gall*

之后,find 命令使用该模式来搜索与该模式匹配的所有文件(和目录等)。这将找到与gallifrey-road-doctors-14437-1366x768.jpg模式foo-gallifrey-road-doctors-14437-1366x768.jpg匹配的每个文件*gall*

所以:你的命令通过 shell(它不会扩展引号内的全局并去掉最外层的引号),并且然后遍历到find,它在内部使用模式来匹配文件名。

相关内容