linux cp中的通配符

时间:2012-09-21 00:00:56

标签: linux shell glob

当我在cp中使用*时,我认为它遵循与正则表达式相同的规则。 所以"cp temp/* test/"应该复制一切,但是,当临时文件夹为空时,它会抛出异常,说它无法找到文件或目录,指示*无法匹配“无”。

然后我在temp下创建一个文件test.txt并执行:

cp temp/test.txt* test/

它有效,表明*确实与“无”相匹配。

我对这种行为感到困惑。任何人都可以解释一下吗?

由于

3 个答案:

答案 0 :(得分:4)

正在发生的事情是*扩展由您的shell完成(可能是bash)。模式temp/testfile.txt*匹配temp/testfile.txt*匹配零个或多个字符),因此bash将其传递到cp

但是,默认情况下,bash设置为将通配符原样传递给应用程序,如果它与任何内容都不匹配(有一个名为nullglob的选项可以将此变为不直观行为关闭)。所以它将temp/*字面上传递给cp,后者抱怨它不存在。

答案 1 :(得分:1)

shell执行扩展,因此它不是cp特定的。

如果找不到匹配,则没有替换,原始字符串(temp/*)被保留并传递给应用程序。当然cp找不到该名称的文件。

# echo nosuchfile*
nosuchfile*

对“无”的澄清:

temp/*表示temp目录中的条目(文件/目录/ ...),但没有任何文件,因此失败。

temp/test.txt*表示test.txt目录中以temp开头的条目。

答案 2 :(得分:0)

通配符globbing与正则表达式不同,并且有自己的规则。

不同的shell有不同的规则......您希望查看Wikipdia以获得概述。