把目录内容复制到另一个目录,而不再多套一层源目录,是一个常见需求。但源路径写成星号,可能把最重要的隐藏配置漏掉。

星号先由 shell 展开

例如:

cp -R ./source/* ./target/

在常见 Bash 默认设置下,* 不匹配以点开头的名称,例如 .env、.config。cp 接收到的是 shell 已展开的参数,并不是自己解释“所有文件”。其他 shell 或 dotglob、GLOBIGNORE 等选项可能改变结果。Bash 文件名展开

因此,普通文件都复制了,不等于隐藏配置也齐全。不要为了补点文件,随意使用可能触及父目录的通配模式。

用目录本身的内容作为来源

以 GNU cp 为例,source/. 表达复制源目录的内容,而不是依赖 shell 的 *。对已准备好的自建样本、互不嵌套的目录,可以这样理解:

cp -ai -- ./copy-demo/source/. ./copy-demo/target/

执行前先确认这两处确实是自己的样本,目标不是符号链接或重要现有目录。-a 递归复制并尽可能保留结构、链接和属性,-i 在覆盖已有目标文件时询问;它不是预览模式,确认后会实际写入。GNU cp

不要未经核对把命令换成生产路径。若要无人值守复制,必须事先明确冲突和备份策略,不能用 -f 当默认解决办法。

目录内容与目录本身是不同结果

当 target 已存在为目录时,复制 source 目录通常会得到 target/source;复制 source/. 则把其中的条目合入 target。

目标存在与否、尾斜杠、符号链接及不同实现都会影响边界,不能只盯住最终文件名。归档模式尽可能保留属性,也不保证跨文件系统的 ACL、扩展属性和安全上下文都成功保持。

检查的不只是命令退出码

复制后核对普通文件和点文件清单、内容校验和、必要权限与链接目标。对于业务数据,还要确保复制期间没有持续写入造成不一致。

“命令成功”“文件数量相近”和“应用能够正确启动”是不同的验收点。目录迁移先确定范围和一致性要求,再选择复制方式。