ディレクトリに存在するファイルの拡張子を一括変換する

ディレクトリに存在する特定のファイル群について同じような処理をしたくなる時がままある。

その中の代表的な例として、ディレクトリ以下に存在するファイルの拡張子を一括で変換したい場合があげられる。

今回はそういう、特定のファイルのまとまりに対してshell上で処理する方法を記す。

一応zshを基準にかくが、他のshellでも同じ様に動くと思う。たぶん。

ディレクトリに存在する拡張子.txtのファイルを、.csvに変更する。

for filename in `ls *.txt`
do
mv $filename `basename $filename .txt`.csv
done

説明

簡単に説明する。

shell scriptでは変数の値は$で参照する。

バッククオートで囲まれた部分はコマンドとして認識され、そのコマンドの実行結果が返る。上記ではls *.txt拡張子がtxtのファイルのファイル名をlsコマンドで取得している。

for hoge in "$hoge1 $hoge2 $hoge3"で変数hoge1からhoge3までの値を順次hogeに読む込むfor文処理を行っている。今回、hogesはlsで取得した拡張子がtxtのファイル群である。詳しくは、下記を参照。

for 文の使用方法 - UNIX & Linux コマンド・シェルスクリプト リファレンス

後はmvコマンドを使ってファイル名を変換している。このとき、ファイル名から拡張子を取り除く必要があるので、basenameコマンドを使っている。

basenameの使い方は下記を参照。

@IT:ファイル名からディレクトリや拡張子を取り除くには

最後に

lsコマンドの条件やmvでなく他のコマンドに変更すれば特定のファイル群に対して特定の処理を実行できる。