ファイル名を一括処理で連番に変更する方法(1行コピペ)

PC全般 TIPS

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 とすれば良いです。

置換前のファイル名が置換後のファイル名を同一となるファイルが存在する場合、実行後にmvで上書きされる事で一部のファイルが消去されてしまうパターンがあります。注意して下さい。

応用

shスクリプトにして応用します。

基本で書いた処理をそのまま.shにして使うと、3つ使いにくい問題があります。

  1. 基本処理のままだと.shファイル名も書き換えてしまう
  2. スペースが含まれたファイル名が変換できない
  3. 連番の決定は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"

 

ブログ・ランキングに参加しています。ポチっと押してから去って頂く方に感謝です。ありがとうございます。
ブログランキング・にほんブログ村へにほんブログ村


人気ブログランキング

タイトルとURLをコピーしました