この記事の目的は、シェルスクリプトでカレントディレクトリ以下にあるjpgやpngといった画像ファイルを、すべてwebpに変換することです。サブディレクトリ内のデータも含みます。また、高速化のために並列処理をします。
実行環境
- Machine: M2 Pro Mac mini (2023)
- macOS Sonoma 14.3.1
- GNU bash 5.2.26
- ImageMagick 7.1.1-29
スクリプトの提示
以下に、この自動化された並列処理を実行するためのbashスクリプトを示します。このスクリプトは、指定したディレクトリ以下の画像ファイル(PNG、JPG、JPEG)を検索し、それらをwebpフォーマットに変換後、元のファイルを削除します。変換プロセスは並列で実行されるため、作業の完了にかかる時間が大幅に短縮されます。
#!/bin/bash
convert_image() {
img="$1"
name=$(basename "$img" .${img##*.})
dir=$(dirname "$img")
new_path="$dir/$name.webp"
convert "$img" "$new_path" && rm "$img"
}
export -f convert_image
find . -type f \( -iname \*.png -o -iname \*.jpg -o -iname \*.jpeg \) -print0 | parallel -0 convert_image
このスクリプトは、すべてのPNG、JPG、およびJPEGファイルを現在のディレクトリおよびそのサブディレクトリから検索し、それぞれをwebpフォーマットに変換した後、元のファイルを削除します。この自動化されたプロセスにより、手動で行う場合と比べて大幅な時間短縮が可能になります。
スクリプトの実行方法
このセクションでは、前述のbashスクリプトを実行するために必要な環境設定と、スクリプトの具体的な使用方法について詳しく説明します。スクリプトを効果的に活用するには、いくつかの前提条件を満たし、適切な手順で実行することが重要です。
前提条件は以下です。
- ImageMagickのインストール: このスクリプトは
convert
コマンドを使用して画像をwebpフォーマットに変換します。convert
コマンドは、ImageMagickソフトウェアスイートの一部です。ImageMagickは多くのLinuxディストリビューション、macOS、およびWindowsで利用可能です。お使いのシステムにImageMagickがインストールされていない場合は、公式のImageMagickダウンロードページからインストールすることができます。 - GNU parallelのインストール: このスクリプトはGNU parallelを使用して、画像変換プロセスを並列で実行します。これにより、複数の画像を同時に処理することができ、全体の処理時間が大幅に短縮されます。GNU parallelはLinuxディストリビューションのパッケージマネージャーやGNU parallelの公式ページを通じてインストールできます。
スクリプトの主要部分解説
このセクションでは、先に紹介したbashスクリプトの構成要素を詳しく説明し、各部分がどのように機能するかを解説します。スクリプトは大きく分けて三つの主要な処理ステップによって構成されています。画像ファイルの検索、画像の並列変換、および元の画像ファイルの削除です。
1. 画像ファイルの検索
スクリプトはfind
コマンドを使用して、指定したディレクトリ以下のすべてのPNG、JPG、JPEGファイルを検索します。この検索は再帰的に行われ、サブディレクトリ内のファイルも対象となります。
find . -type f \( -iname \*.png -o -iname \*.jpg -o -iname \*.jpeg \) -print0
.
は現在のディレクトリを表します。-type f
はファイルタイプが「ファイル」であるものを検索対象とします。-iname
は大文字小文字を区別せずに名前が一致するファイルを検索します。ここでは、.png
、.jpg
、.jpeg
の各拡張子を持つファイルを対象としています。-print0
は検索結果をNULL文字で区切って出力します。これはparallel
コマンドでの処理に必要です。
2. 画像の並列変換
検索した画像ファイルはparallel
コマンドを通じて並列に処理されます。このステップでは、各画像ファイルがwebpフォーマットに変換されます。
parallel -0 convert_image
-0
オプションは、入力がNULL文字で区切られていることをparallel
に指示します。convert_image
は画像を変換するために定義された関数です。
GNU parallelは、複数のプロセスを並列で実行するための強力なツールです。このスクリプトでは、parallel
コマンドを用いて、検索された各画像ファイルに対してconvert_image
関数を同時に実行させています。これにより、画像の変換タスクがCPUの複数のコアに分散され、タスクの完了速度が向上します。
3. 画像変換関数 convert_image
この関数は、個々の画像ファイルをwebpフォーマットに変換し、成功したら元のファイルを削除します。
convert_image() {
img="$1"
name=$(basename "$img" .${img##*.})
dir=$(dirname "$img")
new_path="$dir/$name.webp"
convert "$img" "$new_path" && rm "$img"
}
img="$1"
は関数に渡された最初の引数(ここでは画像ファイルのパス)を変数img
に代入します。basename
とdirname
コマンドを使用して、ファイル名(拡張子なし)とディレクトリのパスを取得します。convert
コマンドは画像をwebpフォーマットに変換します。変換が成功した場合(&&
の後)、rm
コマンドによって元のファイルが削除されます。
このスクリプトによって、大量の画像ファイルを効率的にwebpフォーマットに変換するプロセスが自動化されます。並列処理の採用により、この変換作業を大幅に高速化することができます。
トラブルシューティング
実際にスクリプトを使用する際には、いくつかの一般的な問題に遭遇する可能性があります。このセクションでは、最も一般的な問題とその解決策をいくつか紹介します。
1. GNU parallelが見つからない
問題: スクリプトを実行しようとすると、「parallel: command not found」というエラーメッセージが表示されます。
解決策:
- GNU parallelがインストールされているかどうかを確認してください。インストールされていない場合は、お使いのシステムのパッケージマネージャーを使用してインストールします。例えば、Ubuntuでは
sudo apt-get install parallel
を実行します。
2. ImageMagickのconvertコマンドが機能しない
問題: convert
コマンドを実行しようとするとエラーが発生するか、期待される出力が得られない。
解決策:
- ImageMagickが正しくインストールされているかを確認してください。インストールされていない、またはバージョンが古い場合は、最新版を公式ウェブサイトからダウンロードしてインストールします。
- 特にMac OSの場合、ImageMagickの最新バージョンでは
convert
コマンドがmagick convert
に置き換えられている可能性があります。その場合は、スクリプト内のconvert
コマンドをmagick convert
に変更してください。
3. スクリプトが特定の画像ファイルを見つけられない
問題: スクリプトを実行しても、一部の画像ファイルが処理されない。
解決策:
find
コマンドのパターンが正しいか確認してください。大文字小文字の違いが原因でファイルが見落とされることがあります。-iname
オプションは大文字小文字を区別しないため、これを使用していることを確認してください。- スクリプトが実行されているディレクトリと、処理したい画像ファイルが格納されているディレクトリが一致しているかを確認してください。必要に応じて、
find
コマンドの検索パスを調整します。
参考資料
この記事では、大量の画像ファイルを効率的にwebp形式に変換し、そのプロセスを並列で実行するbashスクリプトの作成と使用について詳しく説明しました。このスクリプトを使用することで、画像処理タスクの時間を大幅に短縮し、ウェブサイトのパフォーマンスを向上させることができます。また、GNU parallelとImageMagickを活用することで、マルチコアプロセッサの能力を最大限に引き出し、作業の効率を向上させる方法も紹介しました。