cp: -r or -R?
cp의 재귀 복사 옵션, -r과 -R은 어떻게 다를까요?
GNU coreutils에서는 현재 cp의 -r과 -R이 같지만, 예전 GNU 버전과 일부 BSD 계열에서는 동작이 다릅니다. POSIX가 표준으로 지정한 옵션은 -R이므로 여러 유닉스 계열에서 스크립트를 쓴다면 -R이 더 이식성 높은 선택입니다.
- 주제
AI 요약
GNU coreutils의 cp에서 -r과 -R은 이제 같은 옵션입니다. 하지만 늘 같았던 것은 아닙니다. 1992년 GNU fileutils 첫 버전의 코드를 보면 두 옵션 모두 재귀 복사를 켜지만, -r은 파일을 일반 파일처럼 복사하고 -R은 파일 종류에 맞게 처리하도록 설정합니다. 이 차이는 2002년 두 옵션이 통합되면서 GNU에서는 사라졌습니다.
시스템마다 다른 동작
OpenBSD 7.9와 NetBSD 11은 매뉴얼에서 -R만 안내하고 -r 사용을 강하게 권하지 않습니다. 이들 시스템에서 -r은 특수 파일, 심볼릭 링크, FIFO를 올바르게 복사하지 못할 수 있습니다. POSIX.1-2024도 과거의 -r을 표준에서 제외하고, 다른 재귀 옵션과 일관되도록 -R을 권장합니다. chown도 -R은 지원하지만 -r은 지원하지 않습니다.
스크립트에서 고를 옵션
여러 POSIX 계열 시스템을 오가는 스크립트라면 -R을 쓰는 편이 낫습니다. GNU 전용 긴 옵션인 --recursive는 모든 cp 구현이 지원하지 않으며, BusyBox나 BSD 계열에서 동작하지 않을 수 있습니다. 단, 실제 동작은 운영체제와 구현에 따라 확인해야 합니다.
Hacker News 반응
- @mqus — --recursive를 항상 써도 괜찮을까요? 셸 스크립트에서도요?
- @olowe — 세상에는 --recursive 옵션을 인식하지 못하는 cp 구현이 있습니다. 글에서 언급한 OpenBSD와 BusyBox cp도 그렇습니다.
- @dotancohen — 제 생각에는 -R이 어디서나 안전하고 예상대로 동작하는 옵션입니다.
- @bariumbitmap — 이 글은 -r과 -R의 차이가 있다고 계속 암시하고 소스 코드도 링크하지만, 정작 그 차이를 설명하지 않습니다. OpenBSD 매뉴얼에는 역사적인 cp의 -r 옵션이 특수 파일, 심볼릭 링크, FIFO를 올바르게 복사하지 못한다고 나옵니다.
- @embedding-shape — 코드의 flag_copy_as_regular = 1과 flag_copy_as_regular = 0이 차이를 분명히 보여주지 않나요?
- @maxlin — 아니요. 변수 이름만으로는 그게 무슨 뜻인지 알 수 없습니다.
- @throwaway2046 — -R은 POSIX 표준 옵션이고 POSIX 호환 시스템에서 대체로 같은 방식으로 동작하므로, 대문자 -R을 쓰고 싶습니다.
- @ddosmax556 — ‘일반 파일처럼 복사’한다는 말은 cp가 어떤 파일이든 일반 파일처럼 열어 읽는다는 뜻입니다. FIFO가 있으면 내용을 읽으려다 멈출 수 있고, cp -r /dev/zero foo를 실행하면 디스크가 가득 찰 때까지 0을 씁니다. 반면 -R은 FIFO를 FIFO로 복사합니다.
원문: movq.de / 번역·요약: Trawling