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 是为了与其他递归操作保持一致而引入的推荐选项。
  1. bariumbitmap

    这篇博文有点奇怪,因为它一直在暗示 `-r` 和 `-R` 之间存在区别,并链接到了源代码,却从未实际说明区别是什么。我引用一下博文提到但未链接的 OpenBSD 手册:

    > 历史版本的 cp 工具曾有一个 -r 选项。本实现支持该选项;然而,强烈不建议使用它,因为它无法正确复制特殊文件、符号链接或 FIFO。

    https://man.openbsd.org/cp

  2. 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] #

    那我就收下“没人”这个荣誉称号吧 ;-)

  3. mkl

    -a

    我不太明白为什么默认情况下不想保留时间戳、链接等属性。

  4. xrd

    我真的希望有一种方法能知道 LLM 是否像我现在这样错误地幻觉出这些开关。

    感觉这恰恰是它们容易搞错的那类事情。毕竟,训练集并不是为了了解执行上下文(FreeBSD vs macos vs Linux)而训练的吧?

  5. bsoqk

    是 "ditto",不是 "dito"

同日更多故事

2026-10-03