기본 문법
mv [옵션] 원본... 대상
mv는 파일과 디렉터리의 이름을 바꾸거나 다른 경로로 옮기는 명령어입니다. cp와 달리 원본이 남지 않습니다. 같은 파일 시스템 안에서 옮길 때는 데이터를 복사하지 않고 디렉터리 항목만 고쳐 쓰기 때문에 파일 크기와 관계없이 빠르게 끝납니다. 반면 서로 다른 파일 시스템(예: /home 과 별도로 마운트된 /data) 사이에서는 내부적으로 복사한 뒤 원본을 지우므로 시간이 걸리고, 중간에 중단되면 양쪽에 파일이 남을 수 있습니다.
실무에서는 배포 디렉터리 정리, 로그 파일을 archive 디렉터리로 보관, 임시 이름으로 만든 파일을 최종 이름으로 교체하는 작업에 주로 씁니다. 대상 파일이 이미 있으면 기본 동작이 덮어쓰기이므로 -i 나 -n 으로 보호하는 습관이 중요합니다.
리눅스마스터·RHCSA·LPIC 에서는 mkdir, cp, rm 과 함께 출제됩니다. 러닉스에서는 #126 배포 폴더 정리, #127 확장자별 파일 정리 실습으로 연습할 수 있습니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
-i | 대상 파일이 있으면 덮어쓸지 물어봄(대화형) | mv -i app.conf backup/app.conf |
-f | 덮어쓰기 전에 묻지 않음. 앞에 지정한 -i 를 무효화하며, 별도 설정이 없을 때의 기본 동작과 같음 | mv -f app.conf backup/app.conf |
-n | 대상이 이미 있으면 덮어쓰지 않고 건너뜀 | mv -n app.log archive/app.log |
-v | 옮긴 내용을 한 줄씩 출력 | mv -v *.log logs/ |
-u | 원본이 대상보다 새롭거나 대상이 없을 때만 옮김 | mv -u report.txt text/report.txt |
-b | 덮어쓰기 전에 대상의 백업본(기본 접미사 ~)을 만듦 | mv -b app.conf backup/app.conf |
-t 디렉터리 | 대상 디렉터리를 먼저 지정. 원본 목록이 뒤에 오므로 xargs 와 함께 쓰기 좋음 | mv -t logs/ a.log b.log |
-T | 대상을 디렉터리가 아닌 일반 파일 이름으로 취급 | mv -T old new |
-S 접미사 | -b 로 만드는 백업 파일의 접미사를 지정 | mv -b -S .bak app.conf backup/app.conf |
--strip-trailing-slashes | 원본 이름 끝의 / 를 제거하고 처리 | mv --strip-trailing-slashes old/ archive/ |
실무 예시
파일 이름 바꾸기
준비: mkdir -p /tmp/demo; echo 'port=8080' > /tmp/demo/app.conf.tmp
$ cd /tmp/demo && mv app.conf.tmp app.conf && ls
app.conf
같은 디렉터리 안에서 대상 이름을 주면 이름 변경이 됩니다. 원본 이름은 사라집니다.
다른 디렉터리로 옮기기
준비: mkdir -p /tmp/demo/old /tmp/demo/archive; echo 'log line' > /tmp/demo/old/app.log
$ cd /tmp/demo && mv -v old/app.log archive/app.log && ls old archive
renamed 'old/app.log' -> 'archive/app.log'
archive:
app.log
old:
-v 로 어떤 경로에서 어디로 옮겨졌는지 확인할 수 있습니다. ls 는 인자를 이름순으로 정렬해 archive 를 먼저 보여 주며, old 디렉터리는 비어 있습니다.
여러 파일을 한 디렉터리로 옮기기
준비: mkdir -p /tmp/demo/sorting/logs; cd /tmp/demo/sorting; touch a.log b.log c.txt
$ cd /tmp/demo/sorting && mv -v *.log logs/ && ls . logs
renamed 'a.log' -> 'logs/a.log'
renamed 'b.log' -> 'logs/b.log'
.:
c.txt
logs
logs:
a.log
b.log
마지막 인자가 디렉터리면 앞의 파일들이 모두 그 안으로 들어갑니다. 확장자별 정리에 그대로 쓰입니다. ls 출력이 파이프나 스크립트로 넘어갈 때는 한 줄에 한 항목씩 출력됩니다.
덮어쓰기 막기(-n)
준비: mkdir -p /tmp/demo/nover; cd /tmp/demo/nover; echo new > src.txt; echo old > dst.txt
$ cd /tmp/demo/nover && mv -n src.txt dst.txt; cat dst.txt; ls
old
dst.txt
src.txt
-n 을 주면 기존 dst.txt 를 덮어쓰지 않고 건너뛰므로 내용이 old 그대로이고 src.txt 도 남습니다. 건너뛰어도 종료 상태는 0 이므로 성공과 구분되지 않는 점에 주의하세요.
덮어쓰기 전에 백업 남기기(-b)
준비: mkdir -p /tmp/demo/bak; cd /tmp/demo/bak; echo new > app.conf; echo old > app.conf.saved
$ cd /tmp/demo/bak && mv -b app.conf app.conf.saved && ls && cat app.conf.saved app.conf.saved~
app.conf.saved
app.conf.saved~
new
old
대상 파일이 이미 있을 때 원래 내용을 이름~ 형태로 보관한 뒤 덮어씁니다. app.conf.saved 에는 새 내용(new)이, app.conf.saved~ 에는 이전 내용(old)이 들어 있습니다.
주의할 점
- 대상 파일이 이미 있으면 경고 없이 덮어씁니다. 중요한 파일은 -i, -n, -b 를 함께 쓰세요.
- 대상 디렉터리 이름을 잘못 적으면 디렉터리로 이동하지 않고 그 이름의 파일로 이름이 바뀝니다. 대상 끝에 / 를 붙이면 디렉터리가 없을 때 오류가 나므로 예방이 됩니다.
- mv 는 디렉터리를 만들지 않습니다. 옮길 위치가 없으면 mkdir -p 로 먼저 만들어야 합니다.
- 다른 파일 시스템으로 옮기면 복사 후 삭제 방식이라 시간이 걸리고, 중단되면 파일이 불완전하게 남을 수 있습니다.
- Rocky Linux 8 의 root 계정은 /root/.bashrc 에 alias mv='mv -i' 가 설정되어 있어 대화형으로 동작합니다. 스크립트에서는 별칭이 적용되지 않으므로 동작이 달라질 수 있습니다.
- /etc 아래의 설정 파일을 mv 로 교체할 때는 소유자·권한·SELinux 컨텍스트가 원본 파일을 따라가 서비스가 파일을 읽지 못할 수 있습니다. 교체 후 ls -lZ 로 확인하고 필요하면 restorecon 을 실행하세요.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
