cp의 -r과 -R, GNU coreutils에서는 2002년에 병합됐지만 BSD와 POSIX는 여전히 -R만 권장
- GNU coreutils 매뉴얼은 현재 -R, -r, --recursive를 모두 "copy directories recursively"로 같은 동작으로 규정함
- 1992년 coreutils 첫 커밋의 src/cp.c에서는 -r이 flag_copy_as_regular=1, -R이 0으로 갈려 실제 차이가 있었고, 2002년 커밋에서 두 옵션이 병합됨
- OpenBSD 7.9와 NetBSD 11은 매뉴얼에 -R만 싣고 -r 사용을 강하게 말리며, 소스 코드에서도 Rflag와 rflag가 다르게 동작함
- POSIX.1-2024는 -r을 더 이상 명세하지 않고 -R만 유지하는데, 다른 유틸리티의 재귀 옵션과 일관성을 맞추기 위한 선택임
- chown은 -R만 알고 -r은 없음
Hacker News opinions
--recursive 롱옵션을 항상 쓰면 안전한지 궁금함. busybox cp나 OpenBSD cp는 --recursive를 아예 모르고, 더블 대시 롱옵션은 사실 GNU 확장이라 BSD 계열이나 macOS도 지원 안 함. 결국 -R이 어디서나 기대대로 동작하는 안전한 선택임.
cp의 재귀 플래그는 구현 세부사항이 UI로 새어 나온 것 같음. 파일이든 폴더든 복사가 똑같이 동작하는 게 직관적인데, 13년 전에 같은 질문을 unix.stackexchange에 올린 적도 있음.
scp에서는 -r과 -R이 완전히 다른 뜻이라 짜증남. ssh는 포트가 소문자 p인데 scp는 대문자 P인 것도 그렇고, rsync는 ~/somedir와 ~/somedir/를 다르게 처리해서 더 헷갈림.
-a를 왜 기본으로 안 쓰는지 모르겠음. 타임스탬프나 링크 보존은 대부분 원하는 동작인데.
그냥 rsync 쓰면 되지 않나. 다만 rsync는 relink를 전혀 안 해서 cp의 범용 대체품으로는 못 씀.
이 블로그 글은 -r과 -R의 차이를 계속 암시하면서 정작 뭐가 다른지는 안 알려줌. OpenBSD 매뉴얼을 보면 -r은 special file, 심볼릭 링크, FIFO를 제대로 복사하지 못한다고 강하게 경고함.