0. Contents
1. Concept
2. Script Source
3. How to Use
1. Concept
複数の OS 間でファイルをやり取りする時に困るのがファイル名の文字コード。
端末から直接ファイル名を指定して名前を変更するのは非常に面倒である。
という訳で、nkf と find を使って変換用のサブルーチンを作成した。
2. Script Source
ソースは以下の通り (ダウンロード)。
#! /usr/bin/env bash function cne(){ ## 変数のセット local {F,T,S}Code COpt Dir {L,O,E}File ## 引数をチェック while (( $# > 0 )) ; do case "$1" in -f) case "$2" in e|euc) FCode='E' ;; j|jis) FCode='J' ;; s|sjis) FCode='S' ;; w|utf*) FCode='W' ;; *) false esac && shift 2 ;; -t) case "$2" in e|euc) TCode='e' ;; j|jis) TCode='j' ;; s|sjis) TCode='s' ;; w|utf*) TCode='w' ;; *) false esac && shift 2 ;; -d|--depth) [ "$2" -gt 0 ] 2>&- && COpt="-maxdepth $2" && shift 2 ;; *) [[ -d "$1" ]] && Dir=${1%/} && shift ;; esac || { echo "error: $FUNCNAME: $1: Invalid argument." 1>&2 return 1 } done SCode="-${FCode}${TCode:-e}" ## メインルーチン ## 処理対象ファイルの検索 echo -n "$FUNCNAME: Checking '${Dir:=.}/'... " LFile=$( find "$Dir" $COpt -type f 2>&- |while read -r ; do OFile=${REPLY##*/} EFile=$( echo "$OFile" |nkf "$SCode" ) [[ "$OFile" = "$EFile" ]] || echo "$REPLY -> $EFile" done ) [[ -n "$LFile" ]] && echo 'done.' || { echo 'Not found.' 1>&2 return 1 } ## 確認後, 実行 echo -e "\n\n${LFile}\n" read -p "$FUNCNAME: Rename Now ? [y/N] : " [[ "$REPLY" == [yY] ]] && echo || { echo "$FUNCNAME: quit." 1>&2 return 1 } find "$Dir" $COpt -type f 2>&- |while read -r ; do OFile=${REPLY##*/} EFile=$( echo "$OFile" |nkf "$SCode" ) [[ "$OFile" = "$EFile" ]] || mv -v "$REPLY" "${REPLY%/*}/$EFile" done && echo -e "\n$FUNCNAME: done." } cne "$@" |
3. How to Use
USAGE、OPTION は以下の通り。
USAGE: cne (Options) (Directory) -f [Code] : set [From] encode (default: auto) e, euc : EUC-JP j, jis : JIS s, sjis : Shift_JIS w, utf : UTF-8 -d, --depth [Num] : set maxdepth for find -t [Code] : set [To] encode (default: EUC-JP) e, euc : EUC-JP j, jis : JIS s, sjis : Shift_JIS w, utf : UTF-8 [Dir] : set check dir (default: $PWD) |