기본 문법
cp [옵션] 원본... 대상
cp는 원본 파일을 읽어 지정한 경로에 같은 내용의 사본을 만드는 명령어입니다. 대상 경로가 기존 파일이면 그 파일을 덮어쓰고, 디렉터리이면 그 안에 원본과 같은 이름으로 복사본을 만듭니다. 디렉터리 자체를 통째로 복사하려면 -r 옵션이 필요합니다.
실무에서는 설정 파일을 수정하기 전에 원본을 남겨 두거나, 배포 디렉터리로 산출물을 옮기거나, 로그를 백업 디렉터리에 모을 때 사용합니다. 권한·소유자·시간 정보를 그대로 유지해야 하는 백업 작업에서는 -p 또는 -a 옵션을 함께 씁니다.
리눅스마스터·RHCSA·LPIC 같은 시험에서는 mv, mkdir, find와 함께 다뤄집니다. 특정 조건의 파일만 찾아 이름을 바꿔 복사하거나, 템플릿 파일을 복사한 뒤 내용을 덧붙이는 형태가 자주 나옵니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
-r, -R | 디렉터리를 하위 내용까지 재귀적으로 복사 | cp -r /tmp/demo/src /tmp/demo/dst |
-p | 모드·소유자·타임스탬프를 유지(--preserve=mode,ownership,timestamps와 같음) | cp -p app.conf backup/app.conf |
-a | -dR --preserve=all 과 같음(심볼릭 링크와 속성을 최대한 보존하는 재귀 복사) | cp -a /tmp/demo/src /tmp/demo/dst |
-i | 덮어쓰기 전에 확인을 묻는 대화식 복사 | cp -i app.conf backup/app.conf |
-n | 대상이 이미 있으면 덮어쓰지 않고 건너뜀 | cp -n new.conf target.conf |
-f | 대상 파일을 열 수 없으면 그 파일을 지우고 다시 복사를 시도(확인 없이 덮어씀) | cp -f app.conf backup/app.conf |
-u | 원본이 대상보다 최신이거나 대상이 없을 때만 복사 | cp -u src/a.txt dst/a.txt |
-v | 복사한 항목을 한 줄씩 출력 | cp -rv src dst |
-l | 복사 대신 하드 링크 생성(같은 파일 시스템 안에서만 가능) | cp -l a.txt b.txt |
-s | 복사 대신 심볼릭 링크 생성. 대상이 현재 디렉터리가 아니면 원본을 절대 경로로 지정해야 함 | cp -s /tmp/demo/a.txt /tmp/demo/a.link |
실무 예시
파일 하나 복사하기
준비: mkdir -p /tmp/demo; echo 'port=8080' > /tmp/demo/app.conf
$ cp /tmp/demo/app.conf /tmp/demo/app.conf.bak && cat /tmp/demo/app.conf.bak
port=8080
원본과 같은 내용의 사본이 만들어졌는지 확인합니다. 대상 파일이 없으면 새로 생성됩니다.
디렉터리 통째로 복사하기
준비: mkdir -p /tmp/demo/src/sub; echo a > /tmp/demo/src/a.txt; echo b > /tmp/demo/src/sub/b.txt
$ cp -rv /tmp/demo/src /tmp/demo/dst
'/tmp/demo/src' -> '/tmp/demo/dst'
'/tmp/demo/src/sub' -> '/tmp/demo/dst/sub'
'/tmp/demo/src/sub/b.txt' -> '/tmp/demo/dst/sub/b.txt'
'/tmp/demo/src/a.txt' -> '/tmp/demo/dst/a.txt'
-r로 하위 디렉터리까지 복사되고, -v로 복사한 항목이 하나씩 출력됩니다. 출력 순서는 디렉터리를 읽는 순서를 따르므로 이름순이 아닐 수 있습니다.
속성을 유지하며 백업하기
준비: mkdir -p /tmp/demo; echo log > /tmp/demo/old.log; touch -d '2024-01-01 09:00' /tmp/demo/old.log
$ cp -p /tmp/demo/old.log /tmp/demo/old_keep.log && ls -l --time-style=long-iso /tmp/demo/old.log /tmp/demo/old_keep.log
-rw-r--r--. 1 root root 4 2024-01-01 09:00 /tmp/demo/old.log
-rw-r--r--. 1 root root 4 2024-01-01 09:00 /tmp/demo/old_keep.log
-p를 쓰면 수정 시각과 권한이 원본과 동일하게 유지됩니다. 옵션 없이 복사하면 수정 시각이 현재 시각으로 바뀝니다. 권한 표시 끝의 점(.)은 SELinux 보안 컨텍스트가 있다는 표시이며, 소유자는 명령을 실행한 사용자에 따라 달라집니다.
기존 파일 덮어쓰지 않기
준비: mkdir -p /tmp/demo; echo new > /tmp/demo/new.conf; echo keep > /tmp/demo/target.conf
$ cp -n /tmp/demo/new.conf /tmp/demo/target.conf && cat /tmp/demo/target.conf
keep
-n은 대상 파일이 이미 있으면 복사를 건너뜁니다. 기존 내용 keep이 그대로 남아 있는지 확인합니다.
조건에 맞는 로그를 날짜 이름으로 백업하기
준비: mkdir -p /tmp/demo/logs /tmp/demo/backup_logs; echo e1 > /tmp/demo/logs/error.log; echo o1 > /tmp/demo/logs/ok.log
$ find /tmp/demo/logs -name '*error*' -exec cp {} /tmp/demo/backup_logs/backup_$(date +%Y%m%d)_error.log \; && ls /tmp/demo/backup_logs
backup_20260916_error.log
find로 고른 파일만 cp로 복사하면서 파일명 앞에 날짜를 붙입니다. 출력의 날짜 부분은 명령을 실행한 날짜로 바뀝니다. 조건에 맞는 파일이 여러 개면 모두 같은 이름으로 복사되어 마지막 파일만 남으므로, 여러 건을 백업할 때는 원본 이름을 함께 쓰는 방식이 안전합니다.
주의할 점
- 디렉터리를 -r 없이 복사하면 "cp: -r not specified; omitting directory '/tmp/demo/src'" 오류가 납니다.
- 대상 파일이 이미 있으면 확인 없이 덮어씁니다. 중요한 파일은 -i 또는 -n을 붙이세요.
- cp src dst 에서 dst 가 이미 있는 디렉터리면 dst 안에 복사되고, 없으면 dst 라는 이름으로 복사됩니다.
- 옵션 없이 복사하면 타임스탬프가 현재 시각으로 바뀌고 소유자도 명령을 실행한 사용자로 바뀔 수 있습니다.
- /etc 아래 설정 파일을 덮어쓰기 전에는 반드시 원본을 다른 이름으로 먼저 복사해 두고, 복사 후 권한과 SELinux 컨텍스트가 유지되는지 확인하세요.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
