사용 방법

mv 명령은 두 가지 사용법이 있다.

  • 파일 이름을 변경하는 경우
mv file1 file2
  • 하나 이상의 파일을 디렉토리로 옮기는 경우
mv file1 directory
mv file1 file2 directory
mv file1 file2 file3 ... directory

Examples

파일 이름 바꾸기

# a.txt 파일명을 b.txt 로 바꾼다
mv a.txt b.txt
mv {a,b}.txt
mv a.txt !#:1:s/a/b

위의 세 방법은 모두 동일한 결과를 낸다.

파일을 특정 디렉토리로 옮기기

# dir 디렉토리가 존재하고 있다면 file1 파일을 dir 디렉토리로 옮긴다
mv file1 dir
# file1 file2 file3 을 dir 디렉토리로 옮긴다.
mv file1 file2 file3 dir
mv file{1,2,3} dir
mv file{1..3} dir

덮어쓰기 관련 옵션들

  • -i: 덮어쓰기 전에 y/n 을 질문한다.
# b.txt 파일이 있다면, 덮어쓰기 전에 `overwrite? y/n`을 질문한다.
$ mv -i a.txt b.txt
  • -n: 절대로 덮어쓰지 않는다.
# b.txt 파일이 이미 있다면, 아무 일도 하지 않는다. 결과에 대해 출력도 하지 않는다.
$ mv -n a.txt b.txt

결과 보고

-v 옵션을 사용하면 결과를 짧게 보고해 준다. vverbose를 의미하는데 과묵한 mv를 수다스럽게 만드는 옵션이라 생각하면 재미있다.

# c.txt 파일을 f.txt 파일로 이동했다고 알려준다.
$ mv -v c.txt f.txt
c.txt -> f.txt

응용: 많은 수의 파일 이름을 한 번에 변경하기

여러 파일에 대해 mv를 하려 할 때는 [[/cmd/find]]의 -exec 옵션을 사용해 mv를 쓰는 것이 일반적이겠지만, -exec를 쓰는 것이 좀 난감할 상황에서는 이런 방법도 고려할 수 있다.

[[/cmd/pipe]]를 활용해 [[/cmd/bash]]에 넘기는 식으로 여러 파일의 이름 변경을 한 번에 처리하는 방법이다.

예를 들어보자.

다음은 [[/cmd/find]]와 [[/cmd/sed]]를 사용해 현재 디렉토리에 있는 파일들 중, 이름이 t로 시작하는 것들만 골라서 이름 마지막에 _를 붙이는 mv 명령 텍스트를 출력한다.

$ find . -name 't*' | sed -E 's/(.*)/mv \1 \1_/'
mv ./tt2.sh ./tt2.sh_
mv ./test.sh ./test.sh_
mv ./test-.sh ./test-.sh_
mv ./tt.sh ./tt.sh_

이 때 이 출력 결과를 클립보드로 복사하고, 붙여넣어서 실행하는 방법도 있겠지만 다음과 같이 [[/cmd/bash]]에 넘기는 방법도 있다.

$ find . -name 't*' | sed -E 's/(.*)/mv \1 \1_/' | bash -x
+ mv ./tt2.sh ./tt2.sh_
+ mv ./test.sh ./test.sh_
+ mv ./test-.sh ./test-.sh_
+ mv ./tt.sh ./tt.sh_

[[/cmd/bash]]에 준 -x 옵션은 실행되는 명령을 출력해준다.

만약 출력문을 보고 싶지 않다면 -x를 빼면 된다.

$ find . -name 't*' | sed -E 's/(.*)/mv \1 \1_/' | bash

마지막의 bash가 입력으로 받은 문자열을 명령어 구문으로 인식해 실행하기 때문에 이런 작업이 가능하다.

bash로 연결하지 않고 파일로 리다이렉션하거나 위와 같이 스크린에 출력해서 4개의 파일에 대한 이름 변경 작업을 미리 확인할 수도 있다.