A concise history of why Unix cp has both -r and -R, what POSIX says, and when the flags diverge across implementations.
cp: -r or -R?
2026-09-30
A question like this recently came up again. I once tried to find an answer, but only posted it in some "forum" a decade ago, and I think it's worth saving this little bit of trivia from digital nirvana.
Nowadays, there's no difference between the two options in GNU coreutils. The current manual page says:
case 'r':
flag_recursive = 1;
flag_copy_as_regular = 1;
break;
case 'R':
flag_recursive = 1;
flag_copy_as_regular = 0;
break;
So, back then, there was indeed a difference. But that was 34 years ago. Is that still relevant today? Probably not, because ten years later, in 2002, both options got merged and nobody™ still runs coreutils from 24 years ago.
What about other systems?
OpenBSD 7.9 lists only -R in the manual and strongly discourages the use of -r. It does mention, though, that it still behaves differently than -R. Skim through the code and you can spot a few differences (search for Rflag and rflag).
NetBSD 11: Dito, manual page and code like OpenBSD.
The advantage of -R is that it's more consistent across utilities. For example, chown knows -R -- but not -r. POSIX acknowledges this as well and recommends -R:
Earlier versions of this standard included support for the -r option to copy file hierarchies. The -r option is historical practice on BSD and BSD-derived systems. This option is no longer specified by POSIX.1-2024 but may be present in some implementations. The -R option was added as a close synonym to the -r option, selected for consistency with all other options in this volume of POSIX.1-2024 that do recursive directory descent.