次のフォルダ構成に格納されている画像を
g ├── x001 │ ├── 0.png │ ├── a.jpg ├── x002 │ ├── b.jpg └── x003 ├── 0.jpg ├── 1.jpg
こんな感じにしたい。
g ├── x001 │ ├── 0.png │ ├── 0_300x300.png │ ├── a.jpg │ ├── a_300x300.jpg ├── x002 │ ├── b.jpg │ ├── b_300x300.jpg └── x003 ├── 0.jpg ├── 0_300x300.jpg ├── 1.jpg ├── 1_300x300.jpg
次のようなコマンドになる。
find . -regex "\.\/.*\/[0-9]*\..*" | xargs -P8 -I{} convert {} -set filename:x "%d/%t_300x300.%e" -resize 300x300 "%[filename:x]"
それぞれ解説。
対象画像のリストアップ
findコマンドで正規表現を利用する - 屑プログラマの憂鬱 を参照
xargsを使ってImageMagickに渡す
pipeを利用すると、findの結果数が多くて処理が落ちてしまうので、xargsを利用してImageMagickに一つ一つ渡してあげます。
xargs -P8 -I{}
-P8
は、プロセスの並列数です。ImageMagickのconvertが並列で8つ立ち上がります。PCの性能が許す限り増やしていきましょう。
-I {}
は、findの実行結果であるファイル名が入る置換文字列を利用するというオプションです。
ImageMagickでリサイズする
ImageMagickのconvertを利用します。基本的なリサイズ方法としては次のとおりです。アスペクト比を保ちつつリサイズしてくれます。
convert input_file -resize (width)x(height) output_file
ファイル名を変更する場合は、次のようになります。
-set filename:x "%d/%t_300x300.%e"
で、filename:x
という変数に"%d/%t_300x300.%e"
を代入し、出力ファイル名として、\"%[filename:x]"
(filename:xという変数そのままを出力結果とする)としています。
他にも属性は存在して、Format and Print Image Properties @ ImageMagick にまとまっています。