如何查找。-name * foo *`工作吗?


8

我以为*命令中的通配符find . -name *foo*已被bash替换,但是该命令有效,除非*foo*与当前目录中的某些内容匹配,否则不会。令人困惑。


3
注意:如果将其替换为find . -name *foo*find . -name '*foo*'将允许通配符匹配按预期进行。
条例草案

Answers:


14

如果bash找不到匹配项,它将使用*未扩展的s 将文字字符串传递给应用程序。例如:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bash扩展*foo*是因为它匹配,但因为不匹配而*bar*直接通过了。该nullglob选项将告诉bash将不匹配的模式解析为空字符串:

$ shopt -s nullglob
$ /tmp/test *bar*

$

1
简短说明一下zsh具有不同的默认行为,它将返回错误:zsh: no matches found
斯特凡希门尼斯

zsh必须no_nomatch触发此行为。
chx 2014年

5

如果要find获取未扩展的字符串,则可以对其加引号或用反斜杠保护通配符。

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test '*foo*'
*foo*

$ /tmp/test \*foo\*
*foo*
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.