复制目录内容的规范方式:源目录末尾斜杠是否应禁用?
问题解答
说法是否属实?
这个说法是完全属实的,且针对mv命令的风险远高于cp:
- 对于
mv命令:info coreutils 'mv invocation'中的警告确实存在——当源是指向目录的符号链接且带末尾斜杠时,不同系统的行为完全不一致:现代Linux内核下会直接报错errno=ENOTDIR,但FreeBSD 6.1、Solaris 10等系统会静默操作符号链接指向的真实目录,而非符号链接本身,极易引发数据误操作。 - 对于
cp命令:虽然GNU cp下source-dir/会复制目录内所有内容到目标,但在BSD系cp或源为符号链接的场景下,可能出现行为差异,存在跨平台兼容性隐患,并非通用安全的写法。
复制目录内容的推荐方式
根据目标目录是否存在,推荐两种安全写法:
场景1:目标目录已存在
如果确认../destination-dir已经存在,推荐用不带末尾斜杠的源目录,配合cp的基础参数即可:
cp -Rip source-dir ../destination-dir/
若要彻底避免歧义(比如防止cp在目标下创建source-dir子目录),可以加上GNU cp的-T选项(强制不将目标视为目录):
cp -RipT source-dir ../destination-dir
如果需要包含隐藏文件(*不会匹配隐藏文件),可以用:
cp -Rip source-dir/{.,}* ../destination-dir/
场景2:目标目录可能不存在
如果希望目标目录不存在时自动创建,并将源目录内容放入其中,直接写:
cp -Rip source-dir ../destination-dir
这样若../destination-dir不存在,cp会自动创建它并复制source-dir的内容;若已存在,则直接将内容复制到目标目录下。
内容的提问来源于stack exchange,提问作者user21007683
相关产品推荐
相关产品推荐

