当我在cp中使用*时,我认为它遵循与正则表达式相同的规则。
所以"cp temp/* test/"
应该复制一切,但是,当临时文件夹为空时,它会抛出异常,说它无法找到文件或目录,指示*无法匹配“无”。
然后我在temp下创建一个文件test.txt并执行:
cp temp/test.txt* test/
它有效,表明*确实与“无”相匹配。
我对这种行为感到困惑。任何人都可以解释一下吗?
由于
答案 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以获得概述。