2012-07-12 35 views
2

我很困惑与这些TWE句子(找到-name *的.cpp):
差异,(找到-name “*的.cpp”。)

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

正则表达式只适用于情况B. 我很高兴向U学习。谁能解释这一点,更多细节。 非常感谢。

+0

见[行情](http://mywiki.wooledge.org/引用#Prevent_field_splitting_and_ignore_glob_pattern_characters) – ormaaj 2012-07-12 09:11:55

回答

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。这不是你应该使用的东西,但它可以帮助你理解手头的问题。

0

如果在当前目录下运行find命令的任何.cpp文件,然后不带引号的外壳将扩大通配符,并呼吁

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

随着报价,明星被穿过直接找到没有扩张。

0

-name模式 基本文件名(除去领先的目录 路径)的shell模式模式匹配。元字符 ('*','?'和'[]')匹配'。'。在基本名称 (这是findutils-4.2.2中的更改;请参阅下面的标准CON- 表格)的开头。 [...] 不要忘记 用引号括起模式,以保护 由shell扩展。

从找到手动

+0

一如既往,谁downvote应评论和解释原因..但这似乎不是一个普遍的做法... – DonCallisto 2012-07-12 09:15:59

+0

感谢upvotes。战术downvoting是相当有限的SO,但它确实发生。 – 2012-07-12 09:44:10

+0

谢谢。这两个为帮助编辑我的问题 – izual 2012-07-12 10:50:24

1

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

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

当您只需将* .cpp,即使将参数传递给find命令(称为globbing),Shell也会执行替换。 find命令实际得到的不是一个模式,而是一组文件。其导致:

“find。-name A.cppB.cpp ... Z.CPP -name “标志”

的名字用在斜体不是参数文件“,因此,意外的行为。

+0

为什么这是downvoted? – 2012-07-12 14:17:25

+0

@ Christian.K:只有嫉妒可以解释这样一个无情downvote。:-) – 2012-07-12 14:33:06