Linux / 명령어 / cp - 파일과 디렉터리 복사
cp는 파일이나 디렉터리를 다른 경로에 복사하는 명령입니다. 기본 복사부터 재귀 복사, 권한·시간·링크 보존, 덮어쓰기 방지까지 다양한 옵션을 제공하지만 원본과 대상의 형태를 정확히 구분해야 합니다.
이 글에서는 GNU Coreutils의 cp를 기준으로 기본 문법, -r과 -a의 차이, 대상 파일 보호, 심볼릭 링크 처리와 대용량 복사 검증 방법을 설명합니다.
cp 명령어란?
cp는 원본 데이터를 읽어 독립된 대상 파일을 만듭니다. 같은 파일 시스템에서 이름만 추가하는 하드 링크와 달리 복사본은 원본과 별개의 inode와 데이터를 가집니다. 디렉터리는 -R 또는 -a 같은 재귀 옵션을 사용해야 복사할 수 있습니다.
기본 문법
cp [옵션] 원본 대상 cp [옵션] 원본 ... 디렉터리 cp [옵션] -t 디렉터리 원본 ...
파일명이나 경로에 공백이 있으면 따옴표로 감싸고, 하이픈으로 시작하는 이름은 가능한 경우 -- 뒤에 지정합니다. 지원 옵션은 배포판과 GNU Coreutils 버전에 따라 다를 수 있으므로 cp --help와 man cp으로 현재 시스템의 설명을 확인하세요.
cp 기본 사용법
파일을 새 이름으로 복사하기
두 경로를 지정하면 첫 번째 파일을 두 번째 경로로 복사합니다.
cp report.txt report-backup.txt
여러 파일을 디렉터리로 복사하기
원본이 여러 개이면 마지막 인수는 기존 디렉터리여야 합니다.
cp index.html style.css public/
디렉터리를 재귀적으로 복사하기
-R 또는 -r로 디렉터리 트리를 복사합니다. 백업이나 배포처럼 메타데이터 보존이 중요하면 -a를 검토하세요.
cp -R src src-copy cp -a app/ app-backup/
복사한 파일이 같은지 확인하기
cp는 성공해도 보통 출력하지 않습니다. 중요한 복사 작업은 대상 파일 존재뿐 아니라 내용도 확인하세요.
printf 'demo\n' > original.txt cp original.txt copy.txt cmp -s original.txt copy.txt echo $?
예시 출력은 0이며 두 파일의 바이트 내용이 같다는 뜻입니다. 단, cmp는 소유권·권한·확장 속성 같은 메타데이터가 같은지 검증하지 않으므로 필요하면 stat도 확인하세요.
주요 옵션
| 옵션 | 설명 |
|---|---|
-R, -r |
디렉터리와 하위 내용을 재귀적으로 복사합니다. |
-a, --archive |
가능한 속성과 링크 구조를 보존하며 재귀 복사합니다. |
-p |
모드, 소유권과 타임스탬프를 가능한 범위에서 보존합니다. |
-i |
기존 대상을 덮어쓰기 전에 확인합니다. |
-n, --no-clobber |
기존 대상 파일을 덮어쓰지 않습니다. 버전에 따른 세부 동작은 도움말로 확인하세요. |
-u, --update |
대상이 없거나 원본이 더 새로운 경우 등 조건에 따라 복사합니다. |
-v |
처리하는 파일을 출력합니다. |
-T |
대상을 디렉터리가 아닌 정확한 경로로 취급합니다. |
-t DIR |
대상 디렉터리를 옵션으로 먼저 지정합니다. |
--reflink[=WHEN] |
지원되는 파일 시스템에서 copy-on-write 복제를 시도합니다. |
긴 옵션은 의미를 파악하기 쉽고 스크립트 검토에도 도움이 됩니다. 다만 이식성이 중요한 스크립트에서는 대상 시스템이 해당 GNU 확장 옵션을 지원하는지 먼저 확인하세요.
실전 활용 예제
덮어쓰기를 확인하거나 피하기
대화형 작업에서는 -i로 확인할 수 있습니다. 자동화에서 기존 파일을 보존해야 한다면 -n과 종료 상태, 결과 파일을 함께 확인하세요.
cp -iv config.ini backup/ cp -nv *.conf backup/
속성을 보존해 백업하기
-a는 재귀 복사와 함께 심볼릭 링크, 권한, 타임스탬프 등의 보존을 시도합니다. ACL, 확장 속성, SELinux 컨텍스트와 소유권은 파일 시스템과 권한에 따라 완전히 보존되지 않을 수 있습니다.
sudo cp -a /etc/myapp/ /backup/myapp/ cp -a --preserve=all source/ destination/
복사 결과 검증하기
중요한 파일은 크기만 보지 말고 체크섬이나 파일 수를 비교합니다. 작업 중 원본이 변경되는 환경에서는 일관된 스냅샷이나 전용 동기화 도구가 필요할 수 있습니다.
sha256sum source.img copied.img diff -qr source-dir copied-dir
cp와 관련 명령 비교
| 명령·방법 | 주요 역할 | 적합한 상황 |
|---|---|---|
cp |
로컬 파일·디렉터리 복사 | 간단하고 명확한 복사 작업 |
mv |
경로 이동 또는 이름 변경 | 원본 위치에 남길 필요가 없을 때 |
rsync |
증분·원격 동기화와 세밀한 제외 규칙 | 대규모 반복 복사나 네트워크 전송 |
install |
복사와 동시에 권한·소유권 설정 | 프로그램 설치와 배포 단계 |
사용할 때 주의할 점
대상 디렉터리 의미를 확인한다
cp source dir에서 dir이 존재하는 디렉터리인지 여부에 따라 결과 경로가 달라집니다. 스크립트에서는 -T나 -t로 의도를 명확히 할 수 있습니다.
-a가 완전한 백업을 보장하지 않는다
파일 시스템 기능, 권한, 열린 파일과 실행 중 변경 때문에 모든 상태가 보존된다고 단정할 수 없습니다. 서비스 데이터는 애플리케이션에 맞는 백업 절차를 사용하세요.
셸 글로브와 숨김 파일을 구분한다
cp -a source/* dest/의 *는 일반적으로 숨김 항목을 제외합니다. 디렉터리 자체의 내용을 보존하려면 경로 표기와 포함 범위를 검토하세요.
FAQ
디렉터리를 복사할 때 -r과 -a 중 무엇을 사용해야 하나요?
단순 재귀 복사는 -R, 권한·시간·심볼릭 링크 구조 등 가능한 속성까지 보존하려면 -a가 적합합니다.
기존 파일을 덮어쓰지 않으려면 어떻게 하나요?
GNU cp에서는 -n을 사용할 수 있습니다. 중요한 자동화에서는 결과와 설치된 버전의 동작도 확인하세요.
cp -a source/ dest/는 무엇을 복사하나요?
대상 존재 여부와 경로 표기에 따라 결과가 달라질 수 있습니다. 먼저 테스트 디렉터리에서 확인하고 -T 또는 -t로 의도를 분명히 하세요.
복사가 정확했는지 어떻게 확인하나요?
파일은 체크섬, 디렉터리는 diff -qr이나 파일 목록·개수를 비교할 수 있습니다. 중요한 백업은 복원 테스트까지 해야 합니다.









