2

我对这两个句子感到困惑:

A. find . -name *.cpp
B.find . -name "*.cpp"

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

4

4 回答 4

1

您在这里的重点是传递给“-name”选项的参数。我们想要“find”,而不是包含 Shell (bash / tcsh / zsh) 来解释它。

当您放置“*.cpp”时,您实际上允许“查找”程序看到“*.cpp”,然后执行转换为以“.cpp”结尾的所有文件的列表。

当您只输入*.cpp时,Shell 甚至会在将参数传递给 find 命令(称为globbing)之前执行替换。find 命令实际得到的不是一个模式,而是一组文件。这导致 :

“查找. -name A.cpp B.cpp ... Z.cpp

带有斜体名称的文件不是“-name”标志的参数,因此是意外行为。

于 2012-07-12T09:12:46.760 回答
0

如果在您运行 find 命令的当前目录中有任何 .cpp 文件,那么如果没有引号,您的 shell 将扩展通配符并调用

find . -name file1.cpp file2.cpp ...

使用引号,星号直接通过查找而无需扩展。

于 2012-07-12T09:11:16.057 回答
0

-name 模式 文件名的基础(删除了前导目录的路径)与 shell 模式模式匹配。元字符('*'、'?' 和 '[]')匹配一个 '.' 在基本名称的开头(这是 findutils-4.2.2 中的更改;请参阅下面的标准一致性部分)。[...] 不要忘记将模式括在引号中,以防止它被 shell 扩展

从查找手册

于 2012-07-12T09:11:42.140 回答
0

在第一个命令中,*.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. 这不是你应该使用的东西,但它可以帮助你理解手头的问题。

于 2012-07-12T09:10:02.533 回答