異なる拡張子を小文字に変換する

Windows 10では拡張子の大文字・小文字に大きな意味はないものの、Linuxでは別のファイルとして扱うことができる。そのため、拡張子はどちらかで統一した方が使いやすい。ファイル1つであればエクスプローラーから手動で修正すれば済む話だが、ファイル数が多い場合は徒労になってしまう。

BUW上であればコマンドラインから、ワイルドカードを使って「mv」コマンドを使うのがスムーズながらも、異なるファイルタイプを持つファイルが多数ある場合、拡張子ごとにコマンドラインの内容を書き換える必要があるだろう。いくつかのコマンドを組み合わせれば、1ライナーで処理可能ながらも、そこはシェルスクリプトを書いた方が早いはず。

ということで作成したのが以下のシェルスクリプトである。いつもどおり任意のテキストエディターで、下図に示したコードをコピー&ペーストした後に、chmodコマンドで実行モードを付与してから、シェルスクリプトを実行してほしい。

 #!/bin/bash

 CMDNAME=`basename $0`
 IFS_Backup=$IFS
 IFS=$'\n'

 if [ $# -ne 1 ]; then
    echo "Usage: $CMDNAME Directory" 1>&2
    exit 1
 else
    for FName in $(find $1); do
        if [ -f ${FName} ]; then
            Directory=`dirname ${FName}`
            FileName=`basename ${FName%.*}`
            OldExt="${FName##*.}"
            NewExt=`echo ${OldExt} | tr 'A-Z' 'a-z'`

            Src="${Directory}/$FileName.$OldExt"
            Dst="$Directory/$FileName.$NewExt"
            mv ${Src} ${Dst}
            echo "$Src -> $Dst へ変更しました."
        fi
    done
 fi
 IFS=$IFS_Backup

それではシェルスクリプトの内容を説明する。核となるのは11~23行で回しているforループの中身。12行目のif文で変数「FName」に指定したディレクトリ(フォルダー)内のファイル名が展開されている場合は、13~16行目で各変数にディレクトリ、ファイル名、新旧の拡張子を展開している。

古い拡張子は前回も紹介した最長前置パターンの削除を使用し、ディレクトリとファイル名は専用コマンドである「dirname」「basename」を用いた。そして古い拡張子の文字列を格納した変数「OldExt」をechoコマンドで標準出力に書き出し、その結果をパイプ経由で「tr」コマンドを実行、内容を小文字に置換してその結果を変数「NewExt」に展開している。

今回は上図のようなサンプルファイルを用意した

後は後に実行する「mv」コマンド用に変数「Src」「Dst」に、元のパスと(拡張子を小文字に変換した)新しいパスの文字列を作成した。20行目のmvコマンドでそのまま指定しても構わないのだが、実行結果としてecho文を加えているため、一度変数に代入している。

シェルスクリプトの実行には、処理を行うディレクトリの指定が必要となる

こちらは実行結果。各ファイルの拡張子をご覧になると一目瞭然だ

このシェルスクリプトであれば、拡張子のみを対象にしているため、ファイル名やディレクトリ名に悪影響を及ぼす心配はない(はずである)。

阿久津良和(Cactus)