在 linux 系统中,cp 命令用于复制文件和目录。当我们需要复制整个目录树时,通常会加上 -r 或 -R 参数。从功能角度看,这两个参数都表示递归复制,会把源目录下的所有子目录和文件一并拷贝到目标位置。

cp 的 -r 与 -R 参数说明
根据 GNU coreutils 中 cp 的实现,-r 和 -R 以及 --recursive 是等价的,均触发递归复制逻辑。在手册页中可以看到如下描述:
-r, -R, --recursive copy directories recursively
也就是说,在常见的 linux 发行版(如 Ubuntu、CentOS、Debian)里,下面三条命令效果相同:
# 使用小写的 r cp -r src_dir dest_dir # 使用大写的 R cp -R src_dir dest_dir # 使用长选项 cp --recursive src_dir dest_dir
历史版本中的差异
在一些古老的 UNIX 系统里,-r 的实现可能采用某些非标准的遍历方式,而 -R 更符合 POSIX 规范。但现代 linux 使用的 cp 来自 GNU 核心工具集,已经把二者统一,不再有行为区别。
常见使用误区
- 认为 -R 只复制目录结构而 -r 复制文件内容,这是错误的。
- 在脚本中混用两者以为能实现不同逻辑,其实完全多余。
- 忘记加递归参数直接复制目录,会报 omitted directory 错误。
代码示例:递归复制并保留属性
如果还想保留权限、时间戳等属性,可以结合 -a 参数(等价于 -dR --preserve=all):
# 归档式复制,包含递归与属性保留 cp -a /etc/nginx /backup/nginx_$(date +%F)
总结对照表
| 参数 | 含义 | linux 下行为 |
|---|---|---|
| -r | 递归复制 | 与 -R 相同 |
| -R | 递归复制 | 与 -r 相同 |
| --recursive | 递归复制长选项 | 与前两者相同 |
因此在 linux 中使用 cp 时,只需记住递归复制目录加 -r 或 -R 任意一个即可,不必纠结大小写差异。