我注意到,每当我使用命令时,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 个参数(尽管您可能在其他地方有一个目标)。