我碰到这文章试图解释 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
,它在内部使用模式来匹配文件名。