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:只有嫉妒才能解释这种无情的否决权。:-)