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)
|