以下のような連番ファイルが1つのディレクトリ内に存在すると想定します。
00_0000.jpg ... 00_0089.jpg 01_0000.jpg ... 01_0089.jpg : 29_0000.jpg ... 29_0089.jpg
上記の2700ファイルような2つの連番がついたファイルをここでは2次元の連番ファイルと呼ぶことにします。
この2次元の連番ファイルから一部の範囲のファイルを指定する場合、どのようにすればいいでしょうか。
例えばこの2700ファイルの中から「前の連番が05から09」かつ「後の連番が0020から0024」のファイルだけを
コピーしたい場合を考えます。
この場合エクスプローラなどのファイラ上で選択してコピーするという方法は面倒に感じます。
この記事では、この処理をWindows 環境で実現する方法を2つ書きました。
bash による方法
bash コマンドが使用できる環境にある場合、ブレース展開を使用して以下のように書けます。
cp -a ./indir/{05..09}_{0020..0024}.jpg ./outdir/ # 注:a オプションは無くてもコピーできます。 # ファイルの日付情報を保持してコピーする目的でつけています。
この方法のメリットは直感的かつ簡潔に書けることです。
また、3次元以上の多次元連番ファイルへ対応する場合もブレース展開を追加するだけで対応可能です。
デメリットはbash コマンドが使用できる環境に限定されることです。
そのためこの方法を他人のPCで使いたくても使えないという可能性が出てきます。
ちなみに私の環境はWindows Subsystem for Linux が無効になっており、
上記コマンドはMSYS2で動作確認しております。
bat ファイルによる方法
bat で記述する場合、スマートな方法が思いつかなかったので、 愚直にfor ループを二重に行う方法を採りました。 もっと簡潔に書ける方法が知りたいです。
@echo off pushd %~dp0 rem for 文の中で0埋めを行うために変数の遅延展開を有効にする setlocal enabledelayedexpansion for /l %%i in (5,1,9) do ( set y=00%%i set y=!y:~-2! for /l %%j in (20,1,24) do ( set x=0000%%j set x=!x:~-4! copy indir\!y!_!x!.jpg outdir\ ) ) endlocal popd exit /b
この方法のメリットは大抵のWindows 環境で動くということです。
デメリットは簡潔な記述ではないことです。
そのためコピーしたいときにコマンドプロンプトを立ち上げてコマンドを記述するという手軽さはありません。
また、3次元以上の多次元連番ファイルへの対応する場合、どんどんネストが深くなります。
今後の課題
PowerShell での実現方法を検討したいです。