(find。-name * .cpp)和(find。-name“* .cpp”之间的差异)

时间:2012-07-12 09:05:39

标签: shell find

我对这两句话感到困惑:

一个。 find . -name *.cpp
B. find . -name "*.cpp"

正则表达式仅适用于情况B. 我很高兴向你学习。谁可以解释这个,更多细节。 非常感谢。

4 个答案:

答案 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扩展

从查找手册