상황
서버 관리를 하다가 수많은 파일의 이름을 한꺼번에 패턴을 잡아서 바꿔줘야하는 경우가 생겼다.
서버 환경은 다음과 같다.
서버 OS : Ubuntu 18.04 LTS
rename 설치 확인 명령어
수많은 파일의 이름을 패턴을 잡아서 (예를들면 정규식) 한번에 바꿔주는 방법은 rename이라는 명령어로 이미 우분투에서 별다른 패키지 설치 없이 사용가능했다. 혹시나 설치가 안되어 있을 수 있으니 확인해보자.
$ rename
Usage:
rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E *perlexpr*]*|*perlexpr*
[ *files* ]
위에 처럼 결과가 나오면 설치가 되어 있는 것이다. 그러면 먼저 이름을 바꿀 파일들이 존재하는 곳으로 가서 아래 명령어처럼 입력해주면 된다. (설치가 안되어 있다면 설치해주고 진행하자. apt install rename)
rename 기본 사용
설치가 되어있는 것을 확인했으니 기본적인 사용 방법을 써보자. 이번에 사용한 옵션 2가지에 대해서만 정리해보자. (실제로는 더 많다. 여기서는 간단하게 사용한 옵션만 알아보자)
-n : 실제로 변경하지 않음(--no-act). -v 옵션과 함께 사용하여 어떻게 변경될지만 확인 가능.
-v : 이름이 변경된 파일이 있는 경우 표시(--verbose).
파일 1개 이름 바꾸기
파일 1개를 rename과 정규식을 활용해서 이름을 바꾸는 방법은 아래와 같다. (사실 파일 1개는 rename말고 mv 명령어를 통해서도 바꿀 수 있다. 하지만 정규식을 사용하려면 rename을 사용해야한다)
$ rename -n -v 's/원본값/대체값/플래그' 파일명
$ rename -n -v 's/test/testing/g' test.html
(rename은 희한하게 옵션을 하나하나 띄어서 써주어야한다. 예를들어 -nv 이렇게 붙여서 주면 거절한다.. 추후에 이유를 찾아서 알게되면 덧붙일 예정)
추가 2021.12.24.
's/원본값/대체값/플래그' 여기서 플래그를 설정하지 않는 경우에도 맨 마지막 슬래시를 입력해주지 않으면 아래와 같은 에러 메시지가 출력된다
$ rename -v -n 's/원본값/대체값' *
Substitution replacement not terminated at (user-supplied code).
$ rename -v -n 's/원본값/대체값/' *
정상
-n 과 -v 옵션을 주었기 때문에 실제로 바뀌지는 않고 바뀌었을 때의 결과만 보여준다. 원본값, 대체값은 정규식을 사용할 줄 안다면 쉽게 응용 가능하다.
파일 여러개 한번에 이름 바꾸기
우리가 원했던 기능은 한번에 여러 파일의 이름을 바꾸는 것이다. 사실 명령어는 위의 파일 1개 이름 바꾸기에서 크게 다르지 않다.
$ rename -n -v 's/원본값/대체값/' 패턴
$ rename -n -v 's/test/testing/' *.html
실제로 이름 변경을 원한다면 여기서 -n 옵션만 제거해주면 된다.
참고