“grep -r foo *”与“grep -r foo ”。

“grep -r foo *”与“grep -r foo ”。

使用 grep -r 时,您可以搜索带有 * 或 .它似乎返回相同的东西,但它真的一样吗?

假设我搜索“foo”,那么我可以写

grep -r foo *

或者

grep -r foo .

有人会尝试解释 .和 *?

答案1

grep -r foo *不会在隐藏文件或目录中查找匹配项,也*由 shell 扩展,因此您最终可能会得到一个参数列表太长当当前目录中有很多条目时会出现错误,或者如果某些文件或目录的名称以破折号字符开头,则会出现一些其他错误或行为不当。

调用grep -r foo .不存在上述缺陷

更新:

另一个区别:grep 的手册页 (@fedora17) 说:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

当你在空目录中执行这个命令时也会有不同:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$

答案2

如果使用星号,则无法匹配名称以点开头的目录中的文件,例如.cache.

更新:

这是因为 是*在调用 之前由 shell 展开的grep,因此它收到一个名称列表而不是单个目录名称(对于当前.)。 shell 扩展模式的方式可以使用 shell 参数(如nullglobnocaseglob其他bash选项)或环境变量(如LANGLC_ALL)来定制

相关内容