한국일보 애틀랜타
첫광고
엘리트 학원
이규 레스토랑

리눅스/macOS rename 명령어: 파일 이름 일괄 변경 완벽 가이드 (숫자증가 방법)

  • 행인1
  • 2025-05-02

리눅스/macOS rename 명령어: 파일 이름 일괄 변경 완벽 가이드

안녕하세요! 리눅스나 macOS에서 파일 이름을 일괄 변경해야 할 때 rename 명령어는 정말 유용하죠. 파일 정리를 명령어 하나로 끝내거나, 원하는 규칙에 따라 파일 목록을 깔끔하게 만들 수 있거든요.

이 글에서는 rename 명령어의 설치부터 기본적인 사용법, 그리고 정규 표현식과 Perl 코드를 활용한 고급 사용법까지 알아보겠습니다.

rename 설치하기

rename 명령어를 사용하려면 먼저 시스템에 설치해야 합니다. macOS와 Linux(Ubuntu/Debian 계열)에서의 설치 방법은 다음과 같습니다. 윈도우 사용자라면 WSL(Windows Subsystem for Linux)을 설치하여 리눅스 환경에서 사용할 수 있습니다.

#for mac 
brew install rename

#for linux (윈도우라면 wsl을 설치하여 사용을 할 수도 있다.)
sudo apt install rename

기본 사용법: 날짜 형식 변경

 

 

리눅스 시스템에서 관리되는 PDF 파일 목록을 예로 들어보겠습니다. 이 파일들은 매일 업데이트 및 수정되며, 파일 이름에 월일년(MMDDYY) 형식의 날짜가 포함되어 있습니다. 현재 보고 계신 화면은 이 파일들의 목록이며, 이미 날짜 순 등으로 깔끔하게 정렬되어 있습니다. 파일 이름은 '050225'와 같이 월일년 형식의 날짜 패턴에 따라 규칙적으로 잘 정리되어 있습니다.

A_01_050225_AT_COL.pdf
A_02_050225_AT_COL.pdf
...

파일 이름에 포함된 날짜 형식이 '월일년(MMDDYY)' 방식이라, 이를 '년-월-일(YYYY-MM-DD)'과 같이 원하는 다른 패턴으로 변경하고 싶을 때가 있을 수 있습니다. 이때 리눅스의 강력한 rename 명령을 활용하면 이러한 패턴 변경 작업을 효율적으로 처리할 수 있습니다.

rename 명령을 제대로 사용하기 위해서는 정규식(Regular Expression)에 대한 이해가 중요합니다. 변경하려는 패턴과 변경될 패턴을 정규식 문법에 맞춰 지정해야 하기 때문입니다.

rename 명령을 실제로 실행하기 전에, 입력한 정규식 패턴이 의도한 대로 파일 이름을 변경하는지 반드시 미리 확인하는 과정이 필요합니다. 이때 -n (또는 --no-act) 옵션을 사용하면 실제로 파일 이름을 바꾸지 않고, 변경될 결과를 화면에만 출력하여 안전하게 테스트해 볼 수 있습니다.

예를 들어, 현재 디렉토리의 모든 파일(*)에서 발견되는 6자리 숫자 패턴(\d{6})을 '20250501'이라는 고정된 날짜로 바꾸는 것을 테스트하고 싶다면 다음과 같이 실행해 볼 수 있습니다.

rename -n 's/\d{6}/20250501/'  * 
rename(A_01_050225_AT_COL.pdf, A_01_20250501_AT_COL.pdf)
rename(A_02_050225_AT_COL.pdf, A_02_20250501_AT_COL.pdf)
rename(A_03_050225_AT_COL.pdf, A_03_20250501_AT_COL.pdf)
rename(A_04_050225_AT_COL.pdf, A_04_20250501_AT_COL.pdf)
rename(A_05_050225_AT.pdf, A_05_20250501_AT.pdf)
rename(A_06_07_050225_AT_COL.pdf, A_06_07_20250501_AT_COL.pdf)
rename(A_08_050225_AT.pdf, A_08_20250501_AT.pdf)
rename(A_09_050225_AT_COL.pdf, A_09_20250501_AT_COL.pdf)
rename(A_10_050225_AT_COL.pdf, A_10_20250501_AT_COL.pdf)
rename(A_11_050225_AT_COL.pdf, A_11_20250501_AT_COL.pdf)
rename(A_12_050225_AT_COL.pdf, A_12_20250501_AT_COL.pdf)

위에 보시는 내용은 rename -n 명령을 실행했을 때 화면에 출력되는 실행 결과 미리 보기입니다. (-n 옵션 덕분에 실제 파일 이름은 변경되지 않습니다.)

각 줄의 구조는 rename(원본 파일 이름, 변경될 파일 이름) 형태로 되어 있습니다. 즉, 첫 번째 괄호 안의 이름이 두 번째 이름으로 변경될 것이라는 것을 보여줍니다.

이 미리 보기 결과를 통해 파일 이름이 여러분이 의도한 대로 정확하게 변경되는지 꼼꼼히 확인해 볼 수 있습니다.

미리 보기 결과가 만족스럽다면, 이제 -n 옵션 대신 -v 옵션을 사용하여 실제 파일 이름 변경을 실행할 차례입니다. -v (verbose) 옵션은 파일이 실제로 변경될 때 어떤 파일이 어떻게 바뀌었는지 화면에 출력하여 변경 과정을 보여줍니다.

실제 파일 이름을 변경하는 명령어는 다음과 같습니다:

rename -v 's/\d{6}/20250501/' *

 

결과값
결과값

 

 

고급 사용법 1: 숫자 증가시키기

네, 좋습니다. 앞선 날짜 변경에 이어 파일 이름 내 순차적인 번호를 조절하는 심화 단계로 넘어가 보겠습니다. A01..., A02... 등의 파일 이름에서 'A_' 뒤의 번호를 1씩 증가시키거나 감소시키는 작업은 rename과 정규식, 그리고 간단한 스크립트 코드를 통해 효과적으로 수행할 수 있습니다.

우리가 방금 날짜를 변경한 파일들, 예를 들어:

A_01_20250501_AT_COL.pdf
A_11_20250501_AT_COL.pdf
A_12_20250501_AT_COL.pdf

와 같이 파일 이름 앞부분에 순차적인 번호(A_01, A_11, A_12 등)가 붙어 있는 경우를 가정해 봅시다. 여기서 이 번호를 일괄적으로 1씩 증가시키거나 감소시키는 등의 연산을 하고 싶을 때가 있습니다. 예를 들어 A_01을 A_02로, A_02를 A_03으로 바꾸는 식이죠.

이럴 때 rename 패키지는 정규식과 스크립트 기능을 결합하여 아주 유용하게 사용될 수 있습니다. 숫자를 패턴으로 인식한 후, 그 숫자에 연산을 적용하여 새로운 이름을 만드는 방식입니다.

우선, 파일 이름 앞부분의 두 자리 숫자를 1씩 증가시키는 명령어부터 살펴보겠습니다.

rename -n -e 's/(?<=A_)(\d{2})(?=_)/sprintf("%02d",$1+1)/ei' *

rename 명령어로 처슴 A 위치의 2자리 번호를 검색한다
이부분이 정확하게 (?<=A
)(\d{2})(?=) A[](넘버)[_] 우리가 찾고자하는 번호 부분이다.
그리고 이부분의 패턴을 보면 01 , 02 , 03 순으로 진행되고 있다. 그러니깐 열을 맞추기 위해서 0을 넣어 준것인데 이부분을 해결을 하기 위해서는 먼저 숫자로 인식을 시켜야 된다..
그래서 정규식 옵션 e를 맨 마지막에 넣어 준것이다.
sprintf("%02d",$1+1) 실제로

rename -n -e 's/(?<=A_)(\d{2})(?=_)/{$1 + 1}/ei'  

결과값
rename(A_01_20250501_AT_COL.pdf, A_2_20250501_AT_COL.pdf)

이 rename 명령을 실행하게 되면, 파일 이름 내 추출된 숫자가 자동으로 1씩 증가하여 변경됩니다.

여기서 핵심적인 역할을 하는 것이 바로 sprintf("%02d", 계산된_숫자) 부분입니다. 이 함수는 C 언어의 sprintf와 유사하게 작동하며, 계산 결과인 정수 값을 최소 두 자리 문자열로 포맷하되 필요하면 앞에 '0'을 채워주는 역할을 합니다. 덕분에 01, 02와 같이 자릿수를 맞춘 형식을 유지할 수 있습니다.

정확하게 추측하신 대로, 일반적으로 사용되는 rename 명령어는 Perl 언어로 작성되어 있습니다. 따라서 명령어 내에서 사용된 sprintf 함수 역시 Perl의 내장 함수입니다.

네, 잘 정리되었습니다. 해당 명령어를 사용한 "모든 파일에 순차적으로 번호 붙이기" 기능에 대해 좀 더 자세한 설명을 덧붙여 보겠습니다.

고급 사용법 2: 모든 파일 이름 앞에 순차적 번호 붙이기

이 고급 사용법은 현재 디렉토리의 모든 파일 이름 앞에 순차적으로 두 자리 번호(예: 01, 02, ...)를 일괄적으로 붙이는 방법입니다. 파일 목록 전체에 대해 처음부터 끝까지 번호를 매길 때 유용합니다.

예를 들어 보고서.pdf, 사진.jpg, 자료.txt 파일이 있다면, 이를 01보고서.pdf, 02사진.jpg, 03_자료.txt 와 같이 변경할 수 있습니다.

사용할 명령어는 다음과 같습니다. 이 명령어 또한 파일 이름 변경 결과를 미리 보여주는 테스트 실행 (-n) 명령입니다.

rename -n -e 'my $i; BEGIN{$i=0} $i++; $_ = sprintf("%02d", $i) . "_" . $_' *

명령어 상세 설명:

  1. 이 명령어는 -e 옵션을 사용하여 작은 Perl 스크립트를 rename 명령 내에서 직접 실행합니다. 각 부분이 어떤 역할을 하는지 자세히 살펴보겠습니다.

  2. -e: 이 옵션은 따옴표 안에 있는 문자열을 단순한 치환 규칙이 아니라, Perl 코드로 평가하고 실행하도록 rename에게 지시합니다. 이 옵션 덕분에 변수를 사용하고, 초기화하고, 연산을 수행하는 등의 복잡한 작업이 가능해집니다.

  3. my $i;: $i라는 이름의 변수를 선언합니다. 이 변수는 파일에 붙일 번호(카운터)를 저장하는 역할을 합니다. my 키워드는 이 변수를 스크립 내에서 로컬 변수로 만듭니다.

  4. BEGIN{$i=0}: BEGIN 블록 안에 있는 코드는 rename이 실제로 *로 지정된 파일 목록을 처리하기 시작하기 전에 딱 한 번 실행됩니다. 여기서 카운터 변수 $i를 0으로 초기화합니다.

  5. $i++;: 이 코드는 *에 매치된 파일 각각에 대해 이름 변경을 처리하기 직전에 실행됩니다. 파일 하나를 처리할 때마다 $i 값을 1씩 증가시킵니다. (예: 첫 번째 파일 처리 전 $i가 0이었으므로 1이 되고, 두 번째 파일 처리 전 $i가 1이었으므로 2가 되는 식입니다. 따라서 번호가 1부터 시작됩니다.)

  6. $: Perl 스크립트 내에서 현재 rename 명령에 의해 처리되고 있는 파일 이름 자체를 나타내는 특별한 변수입니다. 명령의 목적은 이 $ 변수의 값을 변경하는 것입니다.

  7. sprintf("%02d", $i): 앞서 날짜 변경에서 사용했던 그 sprintf 함수입니다. 현재 카운터 값인 $i를 가져와서 "%02d" 형식에 맞게 문자열로 포맷합니다. "%02d"는 숫자를 최소 두 자리로 만들고, 필요하면 앞에 '0'을 채우도록 지정합니다. (예: $i가 1이면 "01", $i가 10이면 "10", $i가 100이면 "100"으로 포맷합니다.)

  8. .: Perl에서 두 개 이상의 문자열을 하나로 연결할 때 사용하는 연산자입니다.

  9. sprintf(...) . "" . $: 여기서 세 개의 문자열이 연결됩니다.
    sprintf("%02d", $i) 의 결과 (예: "01")
    "" 문자열
    현재 파일 이름인 $
    (예: "보고서.pdf") 이 세 가지가 연결되어 새로운 파일 이름 문자열 (예: "01_보고서.pdf")이 만들어집니다.

  10. $ = ...: 마지막으로, 새롭게 만들어진 파일 이름 문자열을 현재 파일 이름 변수 $에 할당합니다. 이 할당이 rename 명령에게 "이 파일을 이 이름으로 바꿔라" 하고 지시하는 핵심적인 부분입니다.

전체적으로 다시 설명하면 이 명령어는 파일을 처리하기 전 카운터를 0으로 설정하고 (BEGIN), 각 파일을 만나면 카운터를 1 늘린 뒤 (그카운터값을두자리숫자로예쁘게포맷하여원래파일이름앞에붙여새로운이름으로최종결정하는_ = ...) 과정을 모든 파일에 대해 반복하는 스크립트입니다.

미리 보기 (-n) 결과를 확인하시고 원하는 대로 번호가 매겨지는 것을 보셨다면, 이제 -n 옵션을 제거하고 실제 변경을 실행하면 됩니다. 실제 변경 시에는 -v 옵션을 추가하여 변경 목록을 확인하는 것이 좋습니다.

 

rename -v -e 'my $i; BEGIN{$i=0} $i++; $_ = sprintf("%02d", $i) . "_" . $_' *
loading...
이상무가 간다
제목조회수이름등록일
그리스도인에게 줄 수 있는 가장 귀중한 선물11마지막에이기는자2025-05-23
디지털 SAT 6월 직전대비 특강7VETERANS2025-05-23
여름특강 SAT 〈토요일 집중대비반〉 개강!16VETERANS2025-05-22
두렵지만 마주쳐야할 불편한 진실24마지막에이기는자2025-05-21
반드시 알아야할 불편한 진실27마지막에이기는자2025-05-19
치매걸린 엄마를 위한 눈물의 기도19Hanseung Kim2025-05-18
○●미국비자문제, 이민페티션문제, 거절된비자, 체류신분, 자유왕래문제 해결●○21usvisa2025-05-18
사쿠라 허브 추천인 코드 ref4601262 + 할인 쿠폰 저렴하게 구매22monkeycomeon2025-05-17
[온라인설명회_미국입시] 극비문서: 입학사정관의 평가방식23VETERANS2025-05-16
회개;거듭남, 구원, 영생에 이르게하는 확실한 안내자28마지막에이기는자2025-05-14
◉◉◉ 교통사고 / 형사법 전문 로펌 입니다. ◉◉◉20Joo2025-05-14
천지창조의 역사와 지구의 과거, 현재, 그리고 미래 이야기24JaeGap Lee2025-05-12
우크라이나와 러시아의 전쟁은 앞으로 어떻게 될까요....42이나은2025-05-12
가나안 지역의 형성과정 고찰및 영적의미 탐구47마지막에이기는자2025-05-09
이재명 대표가 유죄 판결을 받을 이유36이나은2025-05-08
[긴급] 칼리지보드 모의평가 풀서비스 무료제공34VETERANS2025-05-06
작금의 한국 사법부의 판결에 대한 논란42마지막에이기는자2025-05-06
법륜스님과함께하는 행복학교47제리2025-05-02
리눅스/macOS rename 명령어: 파일 이름 일괄 변경 완벽 가이드 (숫자증가 방법)69행인12025-05-02
남한과 북한의 뿌리가 다른 이유131이나은2025-05-01