cp -R foo/ 和 cp -R foo/* 之间有什么区别

cp -R foo/ 和 cp -R foo/* 之间有什么区别

我注意到,每当我使用命令时,cp -R foo/*我都会复制除文件之外的所有内容,例如.env或可能.gitignore

解决方案是使用cp -R foo/它来处理整个目录,但这并不能改变我仍然不理解使用字符的行为的事实*

为什么*角色无法捕获像这样的文件.env

操作系统是 Debian

答案1

  • cp -R foo/递归复制下面的所有内容foo/
  • cp -R foo/*递归复制所有匹配的文件和目录foo/*。默认情况下,不包括带点的名称(ls *也不会列出它们)。解释如下这里(以及有关前导点的一些其他小细节)。

除了处理以点开头的文件之外,另一个区别是cp -R foo/*将 中的各个文件和目录复制foo/到目标目录中,而cp -R foo/将 中的副本复制foo/到目标目录中(因此您会得到一个以上的目录级别)。

答案2

默认情况下,bash 中的通配符不包括以 a 开头的文件名,. 因此当您指定时,*您要求递归复制而不包含以“ .”开头的文件。当您不指定时,*它会复制所有内容,包括“ .”文件。

答案3

除了您有的其他答案之外,还有其他几种情况,其中foo/foo/*可能不同(不仅仅是以 开头的文件.)。此外,如果您希望以 开头的文件与.您的 glob 匹配,您也可以使用 启用它shopt -s dotglob

第一种情况是,如果 中没有条目foo/,并且您没有启用 ,nullglob那么foo/*将作为传递给 的文字返回cp。由于(在这种情况下)没有源foo/* cp会抱怨,而cp -R foo/总是至少要foo/复制。如果您确实启用了 ,nullglob那么foo/*将扩展为空,因此您最终会缺少 的参数cp

另一个需要考虑的情况是,如果 中有很多条目foo/。shell 会扩展 glob,然后调用该过程,但如果 glob 扩展到太多参数,您将收到错误。此时cp -R foo/您只有 2 个参数(尽管您可能在其他地方有一个目标)。

相关内容