UTF-8 の BOM を消す
UTF-8 なファイルに BOM がついていると、 javac でコンパイルが通らなかったり*1 Velocity で結合したときにゴミが入ったりと色々面倒なので、BOM を消すスクリプトを書いてみました。
スクリプトを書くに当たって:
- ファイルリストを渡すのは find + xargs に任せてます。(面倒だったから!)
- find, xargs は GnuWin32 を使ってます。
- optparse を無理やり使ってます。(使ってみたかったから!)
bomdelete.py
# -*- coding: sjis -*- """ bomdelete.py 使い方: > find -type f -name "*\.html" | xargs python bomdelete.py > find -type f -name "*\.txt" | xargs python bomdelete.py """ import sys from optparse import OptionParser usage = 'find -type f -name "*\.html" | xargs python %prog [-v]' version = '%prog 0.0.1' parser = OptionParser(usage=usage, version=version) parser.add_option( '-v', '--verbose', action='store_true', help=u'BOM削除対象のファイル名を出力します。', ) options, args = parser.parse_args() if len(args) == 0: print 'ファイルが指定されていません。' sys.exit() for fname in args: buf = open(fname, "rb").read() if ['%x' % ord(s) for s in buf[:3]] == ['ef', 'bb', 'bf']: if options.verbose == True: print fname f = open(fname, "wb") f.write(buf[3:]) f.close()
実行結果
D:\temp>python bomdelete.py --help Usage: find -type f -name "*\.html" | xargs python bomdelete.py [-v] Options: --version show program's version number and exit -h, --help show this help message and exit -v, --verbose BOM削除対象のファイル名を出力します。 D:\temp> D:\temp> D:\temp>python bomdelete.py --version bomdelete.py 0.0.1 D:\temp>find -type f -name "*\.html" | xargs python bomdelete.py ./XXX/mock/abcd/xyz02101.html ./XXX/mock/abcd/xyz02104.html ./XXX/mock/abcd/xyz02106.html ./XXX/mock/abcd/xyz02109.html ./XXX/mock/abcd/xyz02110.html ./XXX/mock/abcd/xyz02113.html ./XXX/mock/abcd/xyz02114.html ./XXX/mock/abcd/xyz02115.html ./XXX/mock/abcd/xyz02116.html ./XXX/mock/abcd/xyz02201.html ./XXX/mock/abcd/xyz02201.html ./XXX/mock/abcd/xyz02202.html ./XXX/mock/abcd/xyz02204.html ./XXX/mock/abcd/xyz02208.html ./XXX/mock/abcd/xyz02217.html ./XXX/mock/abcd/xyz02218.html ./XXX/mock/abcd/xyz02220.html ./XXX/mock/abcd/xyz05101.html ./XXX/mock/abcd/xyz05104.html ./XXX/mock/abcd/xyz05105.html ./XXX/mock/abcd/xyz05108.html ./XXX/mock/abcd/xyz05109.html ./XXX/mock/abcd/xyz05112.html ./XXX/mock/abcd/xyz05113.html ./XXX/mock/abcd/xyz05114.html ./XXX/mock/abcd/xyz05115.html ./XXX/mock/abcd/xyz05701.html ./XXX/mock/abcd/xyz05701.html ./XXX/mock/abcd/xyz05704.html ./XXX/mock/abcd/xyz05705.html ./XXX/mock/abcd/xyz05707.html ./XXX/mock/abcd/xyz05708.html ./XXX/mock/abcd/xyz05716.html ./XXX/mock/abcd/xyz07501.html D:\temp>
実行してみて分かったけど GnuWin32 の xargs は長い引数リストを受け取れないみたい(?)。これが残念。
参考にしたサイト