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