ファイル連番処理を間違えた際の修正(bashを用いて)


ファイル連番処理を間違えた際の修正

先日、連番名(00001.jpg etc)のついた大量の画像が、ある画像を起点として、番号が一つずれ、
手で一つ一つ直すのが苦痛だと相談をしてきた後輩がいたので、手伝った時のメモです。

後輩はmacOSを使っていたので今回は修正にbashを使うことにしました。

まず、画像数は90000枚程度で、12000番目から画像が一枚抜けて、最後まで一つ番号がずれていた。
なのでforで繰り返し処理をして、正しいファイル名に修正する。

まずは、12000番目の間違ったファイル名の画像を別のフォルダにコピーする(※失敗した時取り返しがつかないため、作業のためのフォルダを作る、また全ての画像に対してバックアップをとっておく)

元々の画像があるフォルダ→main
バックアップ用フォルダ→backup
作業用フォルダ→folder
修正済みファイル格納フォルダ→fixed

最終的にスクリプトは以下のようになりました。

filenamefix.sh
mkdir folder; mkdir backup; mkdir fixed
cp -r main backup
cp -r main folder
for i in `seq 78000`
do
cp folder/$(($i+11999)).jpg fixed/$(($i+12000)).jpg
done

for i in `seq 11999`
do
i=`printf %05d $i`
cp folder/$i.jpg fixed/
done

コマンド解説

  • mkdirはフォルダを作成するコマンドです。
  • cpはファイルをコピーするコマンドです。
  • forは繰り返し構文です。
  • seqは連続番号の他、一定間隔置きに数字の列を出力するコマンドです。
  • $(())はbashで計算を行う構文です。

作業の流れ

まず各種フォルダを作成する


$ mkdir folder
$ mkdir backup
$ mkdir fixed

次にバックアップをとる

$ cp -r main backup

繰り返し処理を行う

$ for i in `seq 78000`
do
cp folder/$(($i+11999)).jpg fixed/$(($i+12000)).jpg
done

繰り返し処理では、iという変数をfor構文の中で定義し、seqを使って順番に一ずつ数字が代入される

$ for i in `seq 10`
do
echo $i
done

↓result
1
2
3
4
5
6
7
8
9
10

また$(())でファイル名のズレを計算後cpでコピーする
(※bashで変数を扱うときは変数名の前にドルマークが必要)

ファイル名のズレを計算
$ cp folder/$(($i+11999)).jpg fixed/$(($i+12000)).jpg

修正の必要のあるファイル数は合計で78000なので78000回繰り返せば良い。

$ for i in `seq 78000`
do
cp folder/$(($i+11999)).jpg fixed/$(($i+12000)).jpg
done

最後に元々問題のなかったファイルをfixedフォルダに統合する。
(※ちなみに、1から9999までのファイルにはゼロ埋めがされていたので、変数iに対しても1から9999まではゼロ埋めをする必要があった。→ printf %05d $i)

$ for i in `seq 11999`
do
i=`printf %05d $i`
cp folder/$i.jpg fixed/
done

以上で完了です。
作業にかかった時間は説明などを聞く時間も含めておよそ10分程度でした。
もし仮に一つ一つ手で付け直していたら一つのファイル名修正に約10秒かかるとして、
216時間かかることになるので、大変喜んでいました。
こういった作業をPCに不慣れな方でもサクッと解決できるアプリがあればいいなと思いました...