ファイル名の文字コードを変える


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)