Chistory

리눅스 명령어 3. 파일명 일괄변경? 본문

개발 & CS/Linux

리눅스 명령어 3. 파일명 일괄변경?

Chistory 2019. 12. 16. 21:12

다량의 파일의 확장자를 유지한 체, 번호로 된 이름으로 변경하고 싶을 때가 있다. 

흔히 검색해보면 mv를 이용한 파일명 변경과, rename에서 정규식을 약간 활용하는 정도를 설명해준다. 

하지만 쉘스크립트를 짤 줄 안다면, 쉽게 여러 스타일로 이름을 지을 수 있다. 

모든 파일의 이름을 일괄 변경하기는 쉽다. 다음과 같이 할 수 있을 것이다. 

#!/bin/bash
cur=`pwd`
cd $1

file_list=(`ls`)
count=0

for filename in ${file_list[@]}
do
	change_filename=`printf "%3d" $count`
	mv $filename $change_filename
	count=$($count+1)
done
cd $cur

위 스크립트는, 첫번째 인자로 들어온 디렉토리에 들어간 뒤에, 모든 파일 리스트를 읽는다. 

그 후에, count라는 변수의 값을 3자리수 정수를 출력하는 printf 명령어를 태워서, 그 숫자로 파일명을 바꾼다. 

만약 확장자가 일정하다면, mv 뒤에 ${chang_filename}.jpg 같이 하면 확장자도 유지할 수 있을것이다.

시간 순으로 정렬하고싶다면 ls -s 등의 옵션으로 파일리스트를 가져오거나, 다른 다양한 방법으로 파일 리스트를 가져올 수 있을것이다.  

그런데, 만약에 난잡한 사진과 동영상이 섞인 파일 리스트에 대해 이름을 정리하고싶다면?

아래 스크립트는 그것을 일부 해결해준다.

#!/bin/bash
cur=`pwd`
cd $1

file_list=(`ls`)


for filename in ${file_list[@]}
do
        mimetype=`file -i $filename`
        if [ `echo "$mimetype" | grep mp4 | wc -l ` -eq 1 ]; then
                suf="mp4"
        elif [ `echo "$mimetype" | grep x-msv | wc -l ` -eq 1 ]; then
                suf="avi"

        elif [ `echo "$mimetype" | grep quick | wc -l ` -eq 1 ]; then
                suf="mov"

        elif [ `echo "$mimetype" | grep x-m4v | wc -l ` -eq 1 ]; then
                suf="m4v"
        elif [ `echo "$mimetype" | grep jpeg | wc -l ` -eq 1 ]; then
                suf="jpeg"
        fi
        mv $filename $filename.$suf
done
cd $cur

file 명령어는 파일의 헤더를 읽고, 어떤 종류의 파일인지를 알려준다. 각 파일들에 대해 file 명령어를 사용해보고,

거기서 유추할 수 있는 결과를 가져와 조건문을 만들었다. 이렇게 하면, 파일에 알맞는 확장자를 붙여줄 수 있다. 

'개발 & CS > Linux' 카테고리의 다른 글

프록시 솔루션간단 비교..  (0) 2020.01.03
haproxy libssl 에러  (0) 2020.01.03
리눅스 명령어 2. test와 if  (0) 2019.12.05
리눅스 명령어 1. dd  (0) 2019.12.03
쉘스크립트  (0) 2019.09.16
Comments