Linux環境で、あるファイル名の一部を一括でリネームしたい場合にワンライナーで置換する方法についてメモします。
リネーム対象のファイルを準備する
まずはテスト用のファイルとして以下のファイルを作成します。
$ for i in {1..3}; do touch hoge_$i.txt; done $ ls hoge_1.txt hoge_2.txt hoge_3.txt
ひとまず3つのファイルを作成しました。
sedコマンド + awkコマンド + xargsコマンドで一括リネームする
それでは、sedコマンド 、awkコマンド 及びxargsコマンドをパイプで繋いでファイル名を変更する方法を考えてみます。
今回は接頭辞の"hoge"を"piyo"に変更することを目的とし、順番に確認しながら実行していきます。
# 対象ファイル一覧取得 $ ls *.txt hoge_1.txt hoge_2.txt hoge_3.txt # sedコマンドで"hoge"を空文字に置換 $ ls *.txt | sed -e s/hoge// _1.txt _2.txt _3.txt # awkコマンドでmvコマンドに渡す引数部分を作成 $ ls *.txt | sed -e s/hoge// | awk '{print $1}' _1.txt _2.txt _3.txt $ ls *.txt | sed -e s/hoge// | awk '{print "hoge" $1 " piyo" $1}' hoge_1.txt piyo_1.txt hoge_2.txt piyo_2.txt hoge_3.txt piyo_3.txt # xargsコマンドのオプション"-n"で引数を2つ指定する $ ls *.txt | sed -e s/hoge// | awk '{print "hoge" $1 " piyo" $1}' | xargs -n 2 hoge_1.txt piyo_1.txt hoge_2.txt piyo_2.txt hoge_3.txt piyo_3.txt # 最終的にmvコマンドで一括リネーム $ ls *.txt | sed -e s/hoge// | awk '{print "hoge" $1 " piyo" $1}' | xargs -n 2 mv $ ls piyo_1.txt piyo_2.txt piyo_3.txt
上記手順で一括でファイル名を変更することができました。
sedコマンド + xargsコマンドで一括リネームする
上記ではawkコマンドを使いmvコマンドに渡す引数部分の組み立てを行いましたが、xargsコマンドの-I
オプションを使うことでもこちらの引数部分の組み立てが可能になります。
それでは同じように、今回は上記で変更した接頭辞"piyo"を"hoge"に変更してみます。
# xargsコマンドのオプション"-I"の後の"X"部分に引数が保持される $ ls *.txt | sed -e s/piyo// | xargs -IX echo piyoX hogeX piyo_1.txt hoge_1.txt piyo_2.txt hoge_2.txt piyo_3.txt hoge_3.txt # mvコマンで一括リネーム $ ls *.txt | sed -e s/piyo// | xargs -IX mv piyoX hogeX $ ls hoge_1.txt hoge_2.txt hoge_3.txt
上記の何の方法でもファイル名の一括変更が実現できました。