Linux

ファイルの拡張子の一括置換


後輩が1ファイルずつ変換コマンドを作っていたので、
こういうやり方があるよと調べながら教えたのでメモ。

  • カレントディレクトリにあるファイルの.txtのファイルを.csvに変換する例
ls *txt | sed -e s/\.txt// | awk '{print $1 ".txt " $1 ".csv"}' |xargs -n 2 mv

若手の時に先輩にこんなコマンドを渡されても
何が何だかわからず調べることも出来なかったのでちと説明。
lsの代わりに「find . -name '*txt'」とかだとカレントディレクトリ以外もいける。

1. 一覧を出す

$ ls *txt
foo.txt     hoge.txt

2. ファイル名だけにする

# .txtを置換して消してるだけ。
$ ls *txt | sed -e s/\.txt//
foo
hoge

【 sed 】 文字列の置換,行の削除を行う

3. mv用のパラータの作成

$ ls *txt | sed -e s/\.txt// | awk '{print $1 ".txt " $1 ".csv"}'
foo.txt foo.csv
hoge.txt hoge.csv

【 awk 】コマンド(基本編)

4. あとはmvコマンドにパラメータを流す

$ ls *txt | sed -e s/\.txt// | awk '{print $1 ".txt " $1 ".csv"}' |xargs -n 2 mv

【xargs】標準入力から生成したコマンドラインを実行する