1行で書けるファイル・リネーム処理の備忘録。
大量のファイル名を一括で変更したい。
かつ、変更後のファイル名は連番にしたい。
動作環境
Linux (Ubuntu 20.04)での実行結果を載せています。
Windowsでもエクスプローラーだけでリネームできますが、任意の文字列に変更できなくてショボすぎるので却下。
コマンドプロンプトで処理するのはBATファイルだと簡潔に書けないし、awkを使って簡単に書きたい。
Windows環境で実行したいという場合は、Linuxコマンドが使えるBusyBoxを入れて下さい。
これでgawkとか使えるようになります。
Linuxで処理する前提なので、BusyBoxの詳細は割愛します。
ファイル名を連番にリネームする方法
基本
~/sample/ディレクトリ内のJPGファイルを例にします。
jj@jj-Ubuntu:~/sample$ ls -1 IMG_2498.jpg IMG_2499.jpg IMG_2501.jpg IMG_2504.jpg IMG_2505.jpg
シンプルに書くと、下記の1行でOK。
jj@jj-Ubuntu:~/sample$ ls |awk '{printf "mv \"%s\" %03d.jpg\n", $0, NR }' |sh
これを実行すると、カレントディレクトリ内の全ファイルを3桁の連番ファイル名に変更します。
ただ、このままだと使いにかったり、全ファイルをリネームできなかったりと問題があるので、応用を後述します。
まずは何をやっているのかの説明から。
lsでファイル名を取得してawkに食わせ、printfでmvコマンドに展開し、| sh で展開したmvコマンドを実行します
| shを外して実行すると、やっている事がわかります。
jj@jj-Ubuntu:~/sample$ ls -1 IMG_2498.jpg IMG_2499.jpg IMG_2501.jpg IMG_2504.jpg IMG_2505.jpg jj@jj-Ubuntu:~/sample$ ls |awk '{printf "mv %s %03d.jpg\n", $0, NR }' mv IMG_2498.jpg 001.jpg mv IMG_2499.jpg 002.jpg mv IMG_2501.jpg 003.jpg mv IMG_2504.jpg 004.jpg mv IMG_2505.jpg 005.jpg
lsで出力される順番にリネームするので、意図しない結果にならないよう、慣れるまでは| sh を外して展開されるmvコマンドを確認して下さい。
下記は、| sh をつけて実行した結果です。
jj@jj-Ubuntu:~/sample$ ls -1 IMG_2498.jpg IMG_2499.jpg IMG_2501.jpg IMG_2504.jpg IMG_2505.jpg jj@jj-Ubuntu:~/sample$ ls |awk '{printf "mv \"%s\" %03d.jpg\n", $0, NR }' |sh jj@jj-Ubuntu:~/sample$ ls -1 001.jpg 002.jpg 003.jpg 004.jpg 005.jpg
連番の桁数を変えたい場合は、%03d→%04dとすると4桁になります。
連番の前後に定形文字列を付けたかったら、foo_%03d とか %03d_foo とすれば良いです。
応用
shスクリプトにして応用します。
基本で書いた処理をそのまま.shにして使うと、3つ使いにくい問題があります。
- 基本処理のままだと.shファイル名も書き換えてしまう
- スペースが含まれたファイル名が変換できない
- 連番の決定はawkのNR(現在処理しているレコード番号)を使用しているので、必ず1から始まる
今でもスペース無しの8.3形式でファイル管理している猛者はいないと思うので、2番目の問題は致命的です。
あと、必ず1から始まるのも使い勝手が悪いので改善します。
基本処理を少し書き換えます。
~/に0_rename.sh というファイル名で下記処理を記述します。
#! /bin/bash ls "$1" |awk -v num="$2" '{ printf "mv \"'"$1"'%s\" \"'"$1"'%03d.jpg\"\n", $0, (num + NR - 1) }' |sh
これで3つの問題が解決します。
対象ディレクトリ名は”$1″で取得、
開始番号はawkの-vオプションを使ってnumにセット。
mvの引数は””で囲ってスペース有り文字列にも対応。
使い方は
jj@jj-Ubuntu:~$ ./0_rename.sh リネームしたいファイル格納ディレクトリ 連番の開始番号
連番の開始番号は省略可能です。
省略した場合は0から始まります。
以下、| sh を外した実行結果です。
jj@jj-Ubuntu:~$ ls -1 sample IMG_2498.jpg IMG_2499.jpg IMG_2501.jpg IMG_2504.jpg IMG_2505.jpg jj@jj-Ubuntu:~$ jj@jj-Ubuntu:~$ /.0_rename.sh sample/ 100 mv "sample/IMG_2498.jpg" "sample/100.jpg" mv "sample/IMG_2499.jpg" "sample/101.jpg" mv "sample/IMG_2501.jpg" "sample/102.jpg" mv "sample/IMG_2504.jpg" "sample/103.jpg" mv "sample/IMG_2505.jpg" "sample/104.jpg"
ブログ・ランキングに参加しています。ポチっと押してから去って頂く方に感謝です。ありがとうございます。
にほんブログ村