ディレクトリに存在するファイルの拡張子を一括変換する
ディレクトリに存在する特定のファイル群について同じような処理をしたくなる時がままある。
その中の代表的な例として、ディレクトリ以下に存在するファイルの拡張子を一括で変換したい場合があげられる。
今回はそういう、特定のファイルのまとまりに対して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の使い方は下記を参照。
最後に
ls
コマンドの条件やmv
でなく他のコマンドに変更すれば特定のファイル群に対して特定の処理を実行できる。