1

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

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

cp temp/test.txt* test/

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

我对这种行为感到困惑。谁能解释一下?

谢谢

4

3 回答 3

4

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

但是,bash默认情况下,如果通配符不匹配任何内容,则默认将通配符传递给应用程序(有一个选项nullglob可以关闭这种不直观的行为)。所以它从temp/*字面上传递给cp,它抱怨它不存在。

于 2012-09-21T00:14:18.570 回答
1

外壳进行扩展,因此并不cp具体。

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

# echo nosuchfile*
nosuchfile*

对“无”的一些澄清:

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

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

于 2012-09-21T00:12:39.513 回答
0

通配符globbing与正则表达式不一样,有自己的完整规则。

不同的 shell 有不同的规则……你想看看Wikipdia以获得一个概述。

于 2012-09-21T00:14:46.780 回答