Engineering Note

プログラミングなどの技術的なメモ

ファイル名を一括でリネームする

console

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

 

上記の何の方法でもファイル名の一括変更が実現できました。

 

参考書籍

新しいLinuxの教科書