본문 바로가기
C.W.K.
Stream
Lesson 08 of 12 · published

cp, mv: 복사와 이동

~12 min · cp, mv, rsync

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

cp: 덮어쓰기를 의식하며 복사하기

cp source dest는 파일 하나를 복사해. 자주 쓰는 플래그의 책임을 구분해 두면 대량 복사에서도 어떤 보장을 기대하는지 말할 수 있어.

  • -r: 디렉터리 아래를 재귀적으로 복사해.
  • -i: 기존 대상을 덮어쓰기 전에 물어봐.
  • -n: 기존 대상은 덮어쓰지 않고 건너뛰어.
  • -v: 처리하는 항목을 화면에 보여 줘.
  • -p: 모드, 소유권, 수정 시각을 보존하려고 시도해.
  • -a (GNU): 재귀, 속성, 심볼릭 링크를 포함한 archive 동작을 묶어.

마지막 슬래시와 대상 디렉터리의 존재 여부가 결과 구조에 영향을 줘. 처음 쓰는 조합은 버려도 되는 디렉터리에서 같은 모양으로 시험하고, 실제 대상에는 어떤 경로가 생겼는지 확인해.

mv: 이동과 이름 변경

mv는 같은 파일 시스템 안에서 보통 디렉터리 항목을 다시 연결하는 rename으로 처리돼서 빠르고 원자적일 수 있어. 파일 시스템을 건너가면 복사한 뒤 원본을 지우는 작업이 되어 느리고 중간 상태가 생길 수 있어.

-i, -n, -v는 mv에서도 비슷한 덮어쓰기 정책을 정해. -r이 없는 이유는 mv가 가리킨 항목 전체를 이동 대상으로 다루기 때문이야.

파일이 많아지면 rsync를 고려해

여러 파일을 반복해서 옮긴다면 rsync -av source/ dest/가 변경되지 않은 항목을 건너뛰고 속성을 보존하며 처리 내역을 보여 줘. 중단 뒤 이어받기와 원격 전송도 지원하므로 반복 작업의 계약을 더 분명하게 만들 수 있어. 자세한 옵션은 network-remote 트랙에서 다뤄.

마지막 슬래시를 눈으로 확인해

  • cp -r dir1 dir2: dir2가 있으면 그 아래에 dir1이 생기고, 없으면 dir2가 복사본 이름이 돼.
  • cp -r dir1/ dir2/: dir1 안의 내용을 dir2로 복사해.
  • cp -r dir1/. dir2/: 숨은 항목을 포함한 ‘내용’을 가리키는 의도를 더 분명히 드러내.

암기하기보다 cp -nv로 먼저 예상 대상을 출력하고, 결과가 맞을 때만 -n을 빼.

복사와 이동의 핵심은 덮어쓰기 정책이야

대상이 이미 있을 때 교체할지, 그 안에 넣을지, 거부할지는 명령과 옵션, 운영체제에 따라 달라질 수 있어. 중요한 파일은 대상의 존재 여부와 유형을 먼저 확인하고, 대량 작업은 임시 디렉터리에서 같은 구조로 연습해. 성공 메시지 뒤에도 항목 수와 필요한 속성을 검증해.

볼륨 경계가 실패 모양을 바꿔

같은 볼륨의 rename과 달리 다른 볼륨으로의 이동은 복사와 삭제 두 단계야. 공간 부족이나 권한 오류로 일부만 복사될 수 있으므로 목적지 내용을 확인한 뒤 원본이 언제 삭제됐는지도 검사해. 원자적 교체가 필요하면 같은 파일 시스템 안의 임시 경로에서 완성한 뒤 rename하는 구조를 써.

Code

실행 전 시뮬레이션·bash
# -nv로 덮어쓰지 않고 계획만 자세히 표시
cp -rnv src/ dst/
# 계획이 맞을 때 실제 실행
cp -rv src/ dst/
mv로 atomic 설정 교체·bash
# 옆에 새 파일을 완성한 뒤 mv로 원자적 교체
cat > /etc/myapp.conf.new <<EOF
key = value
EOF
mv /etc/myapp.conf.new /etc/myapp.conf

External links

Exercise

~/sandbox/src에 시험 파일 두 개를 만들고 cp -rv ~/sandbox/src ~/sandbox/dst1을 실행한 뒤 결과 구조를 확인해. 이어서 마지막 슬래시가 있는 cp -rv ~/sandbox/src/ ~/sandbox/dst2/를 실행해 두 목적지의 디렉터리 모양이 어떻게 다른지 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.