리눅스 대량 파일명 변경 sed

(Last Updated On: January 3, 2021)

리눅수에서 파일명을 변경 할 이유가 생겼다.

-rw-r--r-- 1 root root  1129422 Jul 24 21:05 '(9970)65193765_p0.jpg'
-rw-r--r-- 1 root root   835037 Jul 24 21:05 '(9976)68999843_p0.png'
-rw-r--r-- 1 root root  1189884 Jul 24 21:05 '(9987)76803149_p0.png'
-rw-r--r-- 1 root root  1246361 Jul 24 21:05 '(9993)71244340_p0.png'
-rw-r--r-- 1 root root  3760328 Jul 24 21:05 '(9994)79288444_p0.jpg'
-rw-r--r-- 1 root root  2234349 Jul 24 21:05 '(9997)74228958_p0.png'

이러한 파일이 1만개 가량 있는 상태이다. 원본은 68999843_p0.jpg 일 터인데 앞에 (9970) 이라는게 붙어 있어서 마음에 안들었다.

find 명령에도 정규식으로 찾기 라는게 있지만 정규식에서 값을 인출하는 게 지원하지 않아서 리눅스의 sed 명령을 사용해야 하나보다. (정규표현식 replace가 가능하긴 하지만 굉장히 복잡해서 차라리 반복문 돌리는게 나아보인다)

find './azure-lane/' -type f -regextype posix-egrep -regex '\.\/azure\-lane\/.*' | while read FILE
do
  newfile="$(echo ${FILE} | sed -E 's/\.\/azure\-lane\/\([0-9]+\)/\.\/azure-lane\//')"
  mv $FILE $newfile
done

find 로 수정할 파일명을 가져온다. (위 소스의 경우 내 메모용 코드가 부가되어있어 regex를 굳이 넣지 않아도 해당 폴더를 가져올 것임) 파일명을 배열로 읽어 들여 거기서 원하는 파일명의 내용을 삭제한다. ( sed -s ‘s/targetname/바꿀이름/ , 여기서는 바꿀이름이 공백이라 삭제됨)

기타메모

sed -i -E "s/(<username>.+)name(.+<\/username>)/\1something\2/" file.xml

sed -e '/username/s/CDATA\[name\]/CDATA\[something\]/' \
-e '/password/s/CDATA\[password\]/CDATA\[somethingelse\]/' \
-e '/dbname/s/CDATA\[name\]/CDATA\[somethingdifferent\]/' file.txt