파일처리_19 HTML 파일인 .htm과 .html 확장자를 txt로 일괄 변경하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: 확장자, 파일명 변경, 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 등에서는 사용 가능하지만 우분투 같은 데비안 계열에서는 에러가 발생합니다.