1. 사용 명령어 |
(1) mv
2. 키워드 & 사용처 |
(1) 키워드
확장자, 파일명 변경, case문
(2) 사용처
확장자가 제각각인 파일들을 하나의 확장자로 변경하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ls
abc.html index.htm rename.sh same.htm same.html space.html
# ./rename.sh
$ ls
abc.txt index.txt rename.sh same.txt space.txt
4. 스크립트 |
#!/bin/sh
for filename in * ①
do
case "%filename" in ②
*.htm | *.html ③
# 파일명 앞 부분을 취득(index)
headname=${filename%.*} ④
# 파일명을 .txt로 변환
mv "$filename" "${headname}.txt" ⑤
;;
esac
done
5. 해설 |
이 스크립트는 현재 디렉터리에 있는 확장자가 .htm과 .html인 모든 파일을 .txt 확장자로 변경합니다.
우선 ①에서 *로 현재 디렉터리 파일 목록을 대상으로 셸 변수 filename을 써서 순서대로 처리합니다. 이렇듯 for문 in에 *를 지정하면 파일명이 확장되어서 현재 디렉터리 파일 목록을 간단히 작성할 수 있습니다.
②에서 파일명으로 패턴 매칭을 합니다. case문을 사용하면 파일명에서 지정 문자열을 포함한 것만 골라서 간단히 처리할 수 있습니다. 확장자가 .htm 또는 .html이면 파일명을 변경하므로 일치하는 패턴을 지정하려면 '임의의 문자열 + .htm' 또는 '임의의 문자열 + .html' 형식이면 됩니다. 즉, "*.htm | *.html"이 되므로 ③에서 이 패턴을 작성합니다.
④는 파라미터 확장을 써서 파일명에서 확장자를 제외한 파일명을 추출하는 전형적인 관용구입니다. 지정할 셸 변수에서 %, *로 ".(도트)+임의의 문자열"을 삭제해서 확장자를 제외한 부분을 얻어 셸 변수 headname에 대입합니다.
마지막으로 ⑤에서 확장자를 .txt로 변경합니다. mv 명령어의 두 번째 인수를 큰따옴표로 둘러싼 것은 공백문자(스페이스)를 포함한 파일명에 대응하기 위함입니다.
<주의사항>
이 스크립트는 확장자만 다른 파일이 있으면 파일을 덮어쓰게 됩니다.
$ ls
abc.htm abc.html
$ ./rename.sh
abc.txt
리눅스에는 rename이라는 명령어가 있어서 파일명 일부를 간단히 변경할 수 있습니다. 이 명령어를 쓰면 예제와 같은 동작을 다음처럼 간결하게 작성할 수 있습니다.
rename .htm .txt *.htm
rename .html .txt *.html
그런데 리눅스 rename 명령어는 레드햇 계열 리눅스와 데비안 계열 리눅스에서의 문법이 다릅니다. 이 방법은 레드햇 계열의 CentOS 등에서는 사용 가능하지만 우분투 같은 데비안 계열에서는 에러가 발생합니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 파일처리 - 043 두 파일을 비교해서 오래된 파일 삭제하기 (0) | 2021.03.25 |
---|---|
[Linux 셸 스크립트] 파일처리 - 042 처리 시작 전에 실행 권한을 확인해서 정상 동작이 가능한지 확인 후 실행하기 (0) | 2021.03.25 |
[Linux 셸 스크립트] 파일처리 - 040 파일 퍼미션과 타임 스탬프 등 원래 파일 속성을 유지한 채 파일 복사하기 (0) | 2021.03.24 |
[Linux 셸 스크립트] 파일처리 - 039 tar 아카이브에 파일 추가하기 (0) | 2021.03.24 |
[Linux 셸 스크립트] 파일처리 - 038 tar 아카이브할 때 일부 파일이나 디렉터리 제외하기 (0) | 2021.03.24 |
댓글