리눅스 / 명령어 / cp - 복사하는 명령어, mv - 이동하는 명령어

Linux에서 cp는 파일이나 디렉터리를 복사하고, mv는 파일이나 디렉터리를 이동하거나 이름을 바꿉니다. 두 명령 모두 마지막 경로가 기존 디렉터리인지에 따라 결과가 달라지므로 실행 전에 대상 경로를 확인해야 합니다.

복사와 이동의 차이

두 명령의 기본 형식은 cp 원본 대상과 mv 원본 대상입니다. 복사하면 원본과 별도의 사본이 남지만, 이동하거나 이름을 바꾸면 성공 후 원래 경로에는 해당 항목이 남지 않습니다. 다음 예제는 GNU coreutils의 cp와 mv를 기준으로 합니다.

기존 파일을 같은 이름으로 덮어쓸 수 있으므로 중요한 데이터를 다루기 전에 경로와 대상 내용을 확인하고 필요한 백업을 준비하세요. 아래 실습은 새로 만든 빈 디렉터리에서 진행합니다.

실습 파일 준비하기

다음은 현재 위치에 cp-mv-practice 디렉터리가 아직 없을 때의 예제입니다. 같은 이름이 이미 있으면 다른 빈 위치에서 실습하세요. 첫 명령이 실패하면 이후 명령을 진행하지 마세요.

mkdir cp-mv-practice
cd cp-mv-practice
printf 'Hello Linux\n' > note.txt
mkdir target
ls

note.txt 파일과 빈 target 디렉터리가 표시됩니다. 이후 예제는 이 디렉터리에서 순서대로 실행합니다. printf의 >는 같은 이름의 파일이 있으면 내용을 덮어쓰므로 실제 자료가 없는 곳에서 사용하세요.

파일 복사하기

다음 명령은 note.txt를 현재 디렉터리의 copy.txt로 복사합니다. 성공하면 원본과 사본이 모두 존재합니다.

cp note.txt copy.txt
ls
cat copy.txt

cat은 사본의 내용인 Hello Linux를 보여줍니다. 다음 명령은 기존 디렉터리 target 안에 원래 이름으로 복사합니다.

cp note.txt target/
ls target

대상으로 지정한 이름이 기존 디렉터리가 아니라면 그 이름의 파일이 만들어지거나 기존 파일을 덮어쓸 수 있습니다. 따라서 cp note.txt target은 target이 디렉터리이면 그 안에 복사하지만, 존재하지 않으면 target이라는 파일을 만듭니다. 디렉터리 안에 다른 이름으로 복사하려면 cp note.txt target/other.txt처럼 전체 대상 경로를 지정합니다.

디렉터리 복사하기

디렉터리와 그 안의 항목을 복사할 때는 재귀 옵션 -r을 사용합니다. 다음은 앞에서 만든 target을 아직 존재하지 않는 target-copy로 복사합니다.

cp -r target target-copy
ls target-copy

결과로 target-copy/note.txt가 생기고 원본 target/note.txt도 남습니다. 반면 대상 디렉터리가 이미 있으면 일반적으로 그 안에 원본 디렉터리가 들어갑니다. 예를 들어 cp -r target target-copy를 다시 실행하면 target-copy/target이 생길 수 있습니다. 실행 전 ls로 대상을 확인하세요.

GNU cp -a는 재귀 복사와 함께 링크, 권한, 시간 등 속성을 가능한 한 보존하려고 합니다. 권한이나 대상 파일 시스템의 지원 여부에 따라 모든 속성이 보존되는 것은 아닙니다. 심볼릭 링크의 처리 방식도 옵션에 따라 달라지므로 중요한 자료는 복사 후 확인하세요. 자세한 내용은 GNU cp 설명서를 참고하세요.

파일 이동과 이름 변경

다음 명령은 앞서 만든 copy.txt의 이름을 renamed.txt로 바꿉니다. 성공하면 copy.txt는 없어지고 renamed.txt가 표시됩니다.

mv copy.txt renamed.txt
ls

그다음 파일을 기존 디렉터리로 이동합니다. 원래 위치에는 더 이상 renamed.txt가 없고 target/renamed.txt가 생깁니다.

mv renamed.txt target/
ls target

디렉터리를 이동하거나 이름을 바꿀 때도 mv를 사용하며 cp의 -r은 필요하지 않습니다. 대상 디렉터리가 이미 있으면 그 안으로 이동하고, 대상이 없으면 지정한 이름으로 이동합니다. 이미 존재하는 비어 있지 않은 디렉터리와 충돌하면 실패할 수 있으므로 복사처럼 병합된다고 가정하지 마세요.

서로 다른 파일 시스템 사이에서는 GNU mv가 복사 후 원본을 삭제하는 방식으로 처리할 수 있습니다. 큰 데이터는 시간이 걸릴 수 있고 중간에 실패하면 일부만 이동될 수 있으므로 양쪽의 결과를 확인하세요. GNU mv 설명서에서 자세한 조건을 확인할 수 있습니다.

덮어쓰기와 경로 오류 확인

기존 파일을 덮어쓰기 전에 확인을 받으려면 -i를 사용합니다. 다음은 같은 이름의 파일이 이미 있는 실습 상황입니다. 안내가 나오면 내용을 읽고 덮어쓰려는 경우에만 승인하세요.

cp -i note.txt target/note.txt

mv -i도 기존 대상 파일을 교체하기 전에 묻습니다. 대화식 확인은 자동화된 스크립트의 충돌 처리를 대신하지 않으므로 스크립트에서는 목적에 맞는 동작과 종료 상태를 별도로 점검하세요. 명령이 별칭으로 설정된 환경은 기본 동작이 다를 수 있습니다.

  • 경로에 공백이 있을 때: cp "my file.txt" "target/my file.txt"처럼 각 경로를 따옴표로 감쌉니다.
  • 파일이나 디렉터리를 찾지 못할 때: pwd와 ls로 현재 위치, 철자, 대소문자를 확인합니다.
  • 권한 오류가 날 때: 원본을 읽을 권한과 대상에 쓸 권한을 확인하고, 이동 시 원본 디렉터리에 필요한 권한도 확인합니다. 권한이 없다면 관리자에게 요청하세요.

실습 결과를 확인한 뒤 필요하면 파일 관리 도구에서 cp-mv-practice 디렉터리를 정리할 수 있습니다. 기존 글에서 소개한 Midnight Commander처럼 파일 목록을 보며 복사·이동할 수 있는 도구도 있지만, 서버에 설치되어 있는지와 사용 권한은 환경마다 다릅니다.