diary/Kojima

・tilde-convert.py

波ダッシュ(Full Width Tilde)がうまく表示できないソフトがある問題、とりあえず原因は判明したので、 指定したディレクトリ以下にある 8f a2 b7 な波ダッシュなファイル、ディレクトリ名を a1 c1 に変換して rename するようなスクリプトを書いてみた。

厳密に言うと UTF-8 界で "~" になるコードを "〜" に変換しているので、 ファイル名中に "~" があっても ”〜" にしてしまうので、そういうファイル名を使っている場合は要注意。 まぁ、手元ではそういうファイル名は作らないし、そうなってしまっているのを直したい意図もあるので、 俺様仕様 :-)

# とりあえず emacs のバックアップファイルはイジらないようにはしておいた

#! /usr/bin/python
# -*- coding: euc-jp -*-;

import getopt, sys, commands, os, struct

def conv_tilda(s):
    if s.endswith("~") :      # emacs のバックアップファイルは除く
        return s
    utf8 = s.decode('euc-jp')
    conv = utf8.replace("~", u'〜')
    euc = conv.encode('euc-jp')
    return euc 
 
def usage():
    print sys.argv[0], " [-d] [-h] directory"
    print "convert 8f a2 b7 wave-dash in file and directory name to a1 c1 wave-dash"
    print "  -d : dry run mode"
    print "  -h : print usage(this message)"

def get_parms():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hd", ["help", "dry-run"])
    except getopt.GetoptError:
        usage()
        sys.exit(2)

    result = [opts, args]
    return result

def main():
    opts, filelist = get_parms()

    dry_run = False
    for o, a in opts:
        print "o:",o
        if o in ("-d", "--dry-run"):
            dry_run = True
        if o in ("-h", "--help"):
            usage()
            sys.exit(2) 

    start_dir = filelist[0]
    if os.access(start_dir,os.W_OK) == False:
        if os.access(start_dir, os.F_OK) == False:
            print start_dir, " cannot exist."
        elif os.access(start_dir, os.R_OK) == False:
            print start_dir, " cannot read."
        else:
            print start_dir, " is not writable."
        sys.exit(2)

    print "start_dir:", start_dir 

    list =  os.walk(start_dir)
    for root, dir, files in  list:
        for t in files:
            tt = conv_tilda(t)
            if t != tt:
                old_name = os.path.join(root,t)
                new_name = os.path.join(root, tt)
                if dry_run == False:
                    print "file ", t , "should be",  tt
                    os.rename(old_name, new_name)
                else:
                    print "file ", t , "should be",  tt
                    print "os.rename(", old_name , ",", new_name, ")" 

    list =  os.walk(start_dir)
    for root, dir, files in  list:
        for t in dir:
            tt = conv_tilda(t)
            if t != tt:
                old_name = os.path.join(root,t)
                new_name = os.path.join(root, tt)
                if dry_run == False:
                    print "directory ", t , "should be",  tt
                    os.rename(old_name, new_name)
                else: 
                    print "directory ", t , "should be",  tt
                    print "os.rename(", old_name , ",", new_name, ")"

if ( __name__ == "__main__" ):
    main()

Pythonだとシェルスクリプトみたいに" " や "*" 等の特殊文字をエスケープしないでもよさげなので、 こういう用途には案外便利だな。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:42