[Linux 셸 스크립트] 파일처리 - 041 HTML 파일인 .htm과 .html 확장자를 txt로 일괄 변경하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 파일처리 - 041 HTML 파일인 .htm과 .html 확장자를 txt로 일괄 변경하기

by 찬찬이 아빠 2021. 3. 24.
반응형
  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 등에서는 사용 가능하지만 우분투 같은 데비안 계열에서는 에러가 발생합니다.

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글