ファイルに連番を付けて名前を変更する
フォルダ内にある複数のファイルに対して、順番に番号を付けて名前を変更したい場合があります。写真や動画などの名前を揃えたり順番に並べたりしたい場合です。このような場合、コマンドプロンプトのバッチ処理を使うと自動で連番を付けてファイル名を変更することができます。ここでは、フォルダ内のファイルに対して image001、image002、image003 のような連番を付けて名前を変更する方法について解説します。
ファイルに連番を付けて名前を変更する
例えば次のようなファイルがあるとします。(ファイル名は全部バラバラでも構いません)。
p60.jpg p345.jpg p1582.jpg p2744.jpg
これを次のように「指定したプレフィックス + 3桁の連番.jpg」のような名前にまとめて変換します。
img_001.jpg img_002.jpg img_003.jpg img_004.jpg
次のような内容のバッチファイルを作成します。
@echo off
setlocal enabledelayedexpansion
set PREFIX=img_
set START_NUM=1
set count=%START_NUM%
for /f "delims=" %%f in ('dir /b /on *.jpg') do (
set "num=000!count!"
set "num=!num:~-3!"
echo %%f --^> !PREFIX!!num!.jpg
ren "%%f" "!PREFIX!!num!.jpg"
set /a count+=1
)
echo バッチファイルの処理が完了しました
pause
テキストエディタを使ってバッチファイルの内容を記述したら、画像ファイルがあるフォルダに保存してください。今回は sample.bat として保存しました。
それではバッチファイルを実行します。エクスプローラー上で先ほど作成した sample.bat をダブルクリックしてください。コマンドプロンプトが起動して、次のように表示されます。何かキーを押すとコマンドプロンプトが閉じます。
ファイルを確認してみると、次のようにファイル名が変換されていることが確認できます。
なお今回は img_001.jpg のようなファイル名に変更しましたが、変換前のファイル名にこの形式の名前が付いたファイルがある場合(例えば img_001.jpg というファイルが存在していた場合)は予期せぬ結果となりますので、その場合は変更後のファイル名の形式を変更してください。
バッチファイルの解説
先ほどの使用したバッチファイルの簡単な解説です。
@echo off
バッチファイルではデフォルトでは実行したコマンドが画面に出力されるためエコー機能をオフにしています。(詳しくは「エコー機能のON/OFFを切り替える(ECHO)」を参照されてください)。
setlocal enabledelayedexpansion
遅延環境変数展開を有効にしています。 for 文などのブロック内であっても変数の値を実行時に参照するようにしています。(詳しくは「バッチファイルでの変数の利用と遅延環境変数展開(SETLOCAL)」を参照されてください)。
set PREFIX=img_
変更後のファイルに付ける名前のプレフィックス部分を指定しています。現在は "img_" にしていますが、例えば "旅行写真001.jpg" のような名前にしたい場合は set PREFIX=旅行写真 のように変更してください。
set START_NUM=1 set count=%START_NUM%
連番の開始番号を指定しています。現在は 1 を指定しています。例えば 100 からにしたい場合は set START_NUM=100 のように変更してください。そのあとで変数 count に連番の最初の数値を保存しています。
for /f "delims=" %%f in ('dir /b /on *.jpg') do (
}
カレントディレクトリにある拡張子が .jpg のファイルの一覧を取得したあと、一つずつ変数 f に代入してから繰り返し処理を行っています。
dir /b /on *.jpg の部分で、 /b は DIR コマンドの出力をファイル名だけにしています。また /on はファイルの一覧を名前の部分で昇順で出力するように指定しています。その結果、カレントディレクトリにある拡張子が .jpg のファイルを、名前の部分で昇順で並び替えた結果を取得します。(詳しくは「ファイルの一覧表示(DIR)」を参照されてください)。
FOR コマンドで /f を指定することで、 DIR の結果をいったんすべて読み込んでから繰り返し処理を行います。これは名前を一度変更したあとで、再度変更してしまうことを避けるためです。また delims= を指定することでファイル名を区切り文字で分解せずにまとめてファイル名として扱うようにしています。(ファイル名に半角スペースが含まれていない場合は不要です)。(詳しくは「テキストファイルの内容を区切り文字でトークンに分解し繰り返し処理を使う(FOR)」を参照されてください)。
set "num=000!count!"
ファイル名に設定する連番を変数 num に保存しています。 "0001" "0002" ・・・ "00010" "00011" のようになっていきます。
set "num=!num:~-3!"
実際にファイル名に設定する連番は、後ろの 3 桁の部分だけなので、 SET:~ の構文を使って変数 num の後ろの 3 桁部分だけを変数 num に保存しなおしています。結果として "001" "002" ・・・ "010" "011" のようになっていきます。(詳しくは「バッチファイルで変数の部分文字列を取得する(SET:~)」を参照されてください)。
echo %%f --^> !PREFIX!!num!.jpg
変更後のファイル名は 変数 PREFIX と変数 num を使って !PREFIX!!num!.jpg となります。どのファイルをどんなファイル名に変更するのかを画面に出力しています。
ren "%%f" "!PREFIX!!num!.jpg"
REN コマンドを使って、実際にファイル名を変更しています。(詳しくは「ファイル名の変更(REN, RENAME)」を参照されてください)。
set /a count+=1
繰り返し処理の最後に、連番として設定する数値を 1 だけ増加しています。変数の値を数値として扱うために /a を設定しています。(詳しくは「バッチファイルで変数を使った演算を行う(SET /A)」を参照されてください)。
echo バッチファイルの処理が完了しました pause
最後のメッセージを画面に表示して終了です。コマンドプロンプトがすぐに閉じないように PAUSE コマンドを実行して、何かキーが押されるまではコマンドプロンプトが閉じないようにしています。
-- --
フォルダ内のファイルに対して image001、image002、image003 のような連番を付けて名前を変更する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。