当我在 cp 中使用 * 时,我认为它遵循与正则表达式相同的规则。所以"cp temp/* test/"
应该复制所有内容,但是,当临时文件夹为空时,它会抛出异常,说它找不到文件或目录,这表明 * 不能匹配“无”。
然后我在 temp 下创建一个文件 test.txt 并执行以下操作:
cp temp/test.txt* test/
它有效,这表明 * 确实匹配“无”。
我对这种行为感到困惑。谁能解释一下?
谢谢
发生的事情是*
扩展是由您的外壳完成的(bash
可能)。该模式temp/testfile.txt*
确实匹配temp/testfile.txt
(*
匹配零个或多个字符),因此 bash 将其传递给cp
.
但是,bash
默认情况下,如果通配符不匹配任何内容,则默认将通配符传递给应用程序(有一个选项nullglob
可以关闭这种不直观的行为)。所以它从temp/*
字面上传递给cp,它抱怨它不存在。
外壳进行扩展,因此并不cp
具体。
如果未找到匹配项,则不进行替换,temp/*
保留原始字符串 ( ) 并传递给应用程序。当然cp
找不到该名称的文件。
# echo nosuchfile*
nosuchfile*
对“无”的一些澄清:
temp/*
表示目录中的条目(文件/目录/...)temp
,但没有任何文件,因此失败。
temp/test.txt*
test.txt
表示以temp
目录开头的条目。
通配符globbing
与正则表达式不一样,有自己的完整规则。
不同的 shell 有不同的规则……你想看看Wikipdia以获得一个概述。