- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: 확장자, 파일명 변경, case문
키워드: 복사, 백업, 파일 속성, 심볼릭 링크
사용처: 확장자가 제각각인 파일들을 하나의 확장자로 변경하고 싶을 때
실행예제
$ ls
abc.html index.htm rename.sh same.htm same.html sp ace.html
# ./rename.sh
$ ls
abc.txt index.txt rename.sh same.txt sp ace.txt
스크립트
#!/bin/sh
for filename in * # ------------------------- 1
do
case "%filename" in # ------------------- 2
*.htm | *.html) # ------------------- 3
# 파일명 앞 부분을 취득(index)
headname=${filename%.*} # ----------- 4
# 파일명을 .txt로 변환
mv "$filename" "${headname}.txt" # -- 5
;;
esac
done
해설
이 스크립트는 현재 디렉터리에 있는 확장자가 .htm과 .html인 모든 파일을 .txt 확장자로 변경합니다.
우선 1
에서 *로 현재 디렉터리 파일 목록을 대상으로 셸 변수 filename을 써서 순서대로 처리합니다. 이렇듯 for문 in에 *를 지정하면 파일명이 확장되어서 현재 디렉터리 파일 목록을 간단히 작성할 수 있습니다.
2
에서 파일명으로 패턴 매칭을 합니다. case문을 사용하면 파일명에서 지정 문자열을 포함한 것만 골라서 간단히 처리할 수 있습니다. 확장자가 .htm 또는 .html이면 파일명을 변경하므로 일치하는 패턴을 지정하려면 ‘임의의 문자열 + .htm’ 또는 ‘임의의 문자열 + .html’ 형식이면 됩니다. 즉, “*.htm |
*.html”이 되므로 3
에서 이 패턴을 작성합니다.
4
는 파라미터 확장을 써서 파일명에서 확장자를 제외한 파일명을 추출하는 전형적인 관용구입니다. 지정할 셸 변수에서 %, *로 “.(도트)+임의의 문자열” 을 삭제해서 확장자를 제외한 부분을 얻어 셸 변수 headname에 대입합니다.
마지막으로 5
에서 확장자를 .txt로 변경합니다. mv 명령어의 두 번째 인수를 큰따옴표로 둘러싼 것은 공백문자(스페이스)를 포함한 파일명에 대응하기 위함입니다.
주의사항
-
이 스크립트는 확장자만 다른 파일이 있으면 파일을 덮어쓰게 됩니다.
-
파일을 덮어써서 abc.txt가 하나만 남음
$ ls abc.htm abc.html $ ./rename.sh abc.txt
-
-
리눅스에는 rename이라는 명령어가 있어서 파일명 일부를 간단히 변경할 수 있습니다. 이 명령어를 쓰면 예제와 같은 동작을 다음처럼 간결하게 작성할 수 있습니다.
rename .htm .txt *.htm rename .html .txt *.html
그런데 리눅스 rename 명령어는 레드햇 계열 리눅스와 데비안 계열 리눅스에서의 문법이 다릅니다. 이 방법은 레드햇 계열의 CentOS 등에서는 사용 가능하지만 우분투 같은 데비안 계열에서는 에러가 발생합니다.