我对这两个句子感到困惑:
A. find . -name *.cpp
B.find . -name "*.cpp"
正则表达式仅适用于情况B。我很高兴向U学习。谁可以解释一下,更多细节。非常感谢。
您在这里的重点是传递给“-name”选项的参数。我们想要“find”,而不是包含 Shell (bash / tcsh / zsh) 来解释它。
当您放置“*.cpp”时,您实际上允许“查找”程序看到“*.cpp”,然后执行转换为以“.cpp”结尾的所有文件的列表。
当您只输入*.cpp时,Shell 甚至会在将参数传递给 find 命令(称为globbing)之前执行替换。find 命令实际得到的不是一个模式,而是一组文件。这导致 :
“查找. -name A.cpp B.cpp ... Z.cpp ”
带有斜体名称的文件不是“-name”标志的参数,因此是意外行为。
如果在您运行 find 命令的当前目录中有任何 .cpp 文件,那么如果没有引号,您的 shell 将扩展通配符并调用
find . -name file1.cpp file2.cpp ...
使用引号,星号直接通过查找而无需扩展。
-name 模式 文件名的基础(删除了前导目录的路径)与 shell 模式模式匹配。元字符('*'、'?' 和 '[]')匹配一个 '.' 在基本名称的开头(这是 findutils-4.2.2 中的更改;请参阅下面的标准一致性部分)。[...] 不要忘记将模式括在引号中,以防止它被 shell 扩展。
从查找手册
在第一个命令中,*.cpp
由您的 shell 扩展,但在第二个命令中,*.cpp
原封不动地传递给 find,谁可以在每个子目录中使用它来查找正确的文件。
假设您有两个包含 C++ 文件的子目录:
a.cpp
e.cpp
sub1/
b.cpp
c.cpp
sub2/
d.cpp
第一个命令 ( find . -name *.cpp
) 等价于find . -name a.cpp e.cpp
,这不是你想要的!如果当前目录下没有 cpp 文件,它将找不到任何东西。
逃避*
以防止外壳扩展它的另一种方法是使用:find . -name \*.cpp
. 这不是你应该使用的东西,但它可以帮助你理解手头的问题。