Shell (find.-name*.cpp)和(find.-name*.cpp)之间的差异

Shell (find.-name*.cpp)和(find.-name*.cpp)之间的差异,shell,find,Shell,Find,我被这两个句子弄糊涂了: A.find-名称*.cpp B.find-名称“*.cpp” 正则表达式仅在情况B下有效。 我很高兴向你学习。谁能解释这一点,更多细节。 非常感谢。在第一个命令中,*.cpp由shell展开,但在第二个命令中,*.cpp被原封不动地传递给find,用户可以在每个子目录中使用它来查找正确的文件 假设你有两个带有C++文件的子目录: a.cpp e.cpp sub1/ b.cpp c.cpp sub2/ d.cpp 第一个命令(find.-name*.cpp

我被这两个句子弄糊涂了:

A.
find-名称*.cpp

B.
find-名称“*.cpp”

正则表达式仅在情况B下有效。 我很高兴向你学习。谁能解释这一点,更多细节。
非常感谢。

在第一个命令中,
*.cpp
由shell展开,但在第二个命令中,
*.cpp
被原封不动地传递给find,用户可以在每个子目录中使用它来查找正确的文件

假设你有两个带有C++文件的子目录:

a.cpp
e.cpp
sub1/
  b.cpp
  c.cpp
sub2/
  d.cpp
第一个命令(
find.-name*.cpp
)相当于
find-命名a.cpp e.cpp
,这不是您想要的!如果当前目录中没有cpp文件,它将找不到任何内容


另一种逃避
*
以防止shell扩展的方法是使用:
find-名称\*.cpp
。您不应该使用它,但它可能会帮助您理解手头的问题。

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

find . -name file1.cpp file2.cpp ...
有了引号,星号就可以直接通过查找而无需展开

-名称模式 文件名的基(带前导目录的路径 已删除)与外壳模式匹配。元字符 (“*”、“?”和“[]”)与基名称开头的“.”匹配 (这是findutils-4.2.2中的一项变更;参见标准章节- 性能(见下文)。[…]别忘了 用引号将图案括起来,以防止 通过外壳进行扩展


从find manual(查找手册)

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

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

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

“查找.-名称A.cppB.cpp…Z.cpp”


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

请一如既往地查看,谁应该对否决权做出评论并解释原因。。但这似乎不是一个普遍的做法…谢谢你的投票。在SO中,战术性的否决权是相当有限的,但确实发生了。@Christian.K:只有嫉妒才能解释这种无情的否决权。:-)