cp 命令:-r 和 -R 真的没区别吗?
cp: -r or -R?
最近有人再次问起 cp 命令中 -r 和 -R 的区别。在 GNU coreutils 中,这两个选项如今已完全等同,但在 1992 年的早期版本里,它们的行为确实不同:-r 会将目录当作普通文件复制,而 -R 则递归复制。2002 年两者被合并,差异已成历史。不过,OpenBSD 和 NetBSD 仍保留 -R 并明确不推荐 -r,且行为仍有细微差别。POSIX 标准也建议统一使用 -R,以与其他工具如 chown 保持一致。虽然大多数人早已不再使用 24 年前的 coreutils,但了解这些细节有助于跨平台脚本的兼容性与规范性。
POSIX 标准指出,-r 选项是 BSD 系统的历史实践,而 -R 是为了与其他递归操作保持一致而引入的推荐选项。
HN 评论区
58- bariumbitmap
这篇博文有点奇怪,因为它一直在暗示 `-r` 和 `-R` 之间存在区别,并链接到了源代码,却从未实际说明区别是什么。我引用一下博文提到但未链接的 OpenBSD 手册:
> 历史版本的 cp 工具曾有一个 -r 选项。本实现支持该选项;然而,强烈不建议使用它,因为它无法正确复制特殊文件、符号链接或 FIFO。
- spijdar
> nobody™ still runs coreutils from 24 years ago.
Sprite 2.077 pc386
Welcome to Sprite
root@cherimoya [1] # cp --version
GNU fileutils 3.9
root@cherimoya [2] # cp --help | grep recurs
-r copy recursively, non-directories as files
-R, --recursive copy directories recursively
root@cherimoya [3] #
那我就收下“没人”这个荣誉称号吧 ;-)
- mkl
-a
我不太明白为什么默认情况下不想保留时间戳、链接等属性。
- xrd
我真的希望有一种方法能知道 LLM 是否像我现在这样错误地幻觉出这些开关。
感觉这恰恰是它们容易搞错的那类事情。毕竟,训练集并不是为了了解执行上下文(FreeBSD vs macos vs Linux)而训练的吧?
- bsoqk
是 "ditto",不是 "dito"