当我在 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以获得一个概述。