본문 바로가기

Server/Unix, Linux

리눅스 여러 파일명 변경, 파일명 일괄 변경 with 특수문자

반응형

Prologue

한국어로 된 파일을 웹에서 스크래핑(크롤링) 등으로 받다 보면 이름이 유니코드로 바뀌어서 받아지는 경우가 많다...(특히 맥에서도...) 파일이 한 ~10개정도라면 직접 바꿀 수 있다. 하지만 ~100개 정도라면 고민을 하게 되고 ~1000개 정도라면 코드를 짤 생각을 하게 된다.
리눅스에서는 두 가지 방법으로 가능하다. mv을 통해 스크립트를 짜서 바꾸는 방법이 먼저 떠오르지만, 이보다 똑똑하게 남들이 잘 짜놓은 rename을 이용해서 바꿀 수 있다는 사실을 알게된다면!?

mv

mv의 사용법은 간단하다.
mv [from] [to]
mv는 전체 파일명을 입력하면 단일 파일만 되고, 경로/*와 같은 방식으로 [from]에 입력하면 해당경로에 있는 모든 파일을 이동한다. 추가 옵션을 이용하면 하위폴더에 있는 모든 파일도 이동이 가능하다. 하지만 여기서는 다루지 않겠음!
ex)
mv abc.txt ./folder_1/ abc.txt를 현재폴더에 하위폴더인 egf폴더로 이동
mv ./* ../folder_2/ 현재폴더에 있는 모든 파일을 상위폴더에 위치한 folder_2로 옮기기
mv abc.txt def.txt 현재폴더에 있는 abc.txt를 def.txt로 이동(변경)
이를 이용하면 스크립트로 열심히 짜면...... 되지만, 똑똑한 누군가는 이것을 이미 perl로 잘 만들어놓았다.

rename

Install

rename은 리눅스 기본 내장은 아니고 누군가가 perl로 만들어놓은 명령이다. 다음의 명령어로 쉽게 설치 가능하다.
sudo apt install rename

Usage

rename [from] [to] [target]
참 쉽다. 파일명이 영어로만 되있었다면... 하지만 내 파일명들은 빌어먹게도%EA%B0%80%EB%8D%95%EB%8F%84가 들어있다... 이녀석을 일괄적으로 가덕도로 바꿔야 하는 것...
rename %EA%B0%80%EB%8D%95%EB%8F%84 가덕도 \*.txt 로 쉽게 될줄 알았지만 실패... rename에 특수문자가 먹히지 않는 것 같다...
아 그리고 파일명이 이상하게 바뀌어서 폭망할 수 있기 때문에 -v -n 옵션을 알면 좋다.
rename --help로 더욱 자세한 설명을 볼 수있지만 우리의 시간은 소중하니, 직접 다룰 -v -n의 핵심만 찝어오면 다음과 같다.

Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]

Options:
    -v, -verbose
            Verbose: print names of files successfully renamed.
    -n, -nono
            No action: print names of files to be renamed, but don't rename.

-v는 실행 결과를 자세히 보여주는 것이고
-n은 실재 실행은 아니고 예상 결과를 보여준다.

그리고 여기다가 s/의 정규표현식이 나오는데, 자세히 설명할 수 없으니 그냥 그러려니 하시고 받아들이면 된다.

내가 원하는 예제는 다음과 같이 실행하면 된다.
rename 's/%EA%B0%80%EB%8D%95%EB%8F%84/가덕도/' *.txt
즉, rename 's/[from]/[to]/' [target]으로 실행하면 된다.
만약에 abc_abc_abc_*.txta_a_a_*.txt로 바꾸고 싶다면, s/abc/a/g처럼 맨 끝에 g만 넣으면 된다고 한다.(저는 직접 해보진 않았습니다.)
ref1-여기에나와있어요

반응형