macOSで画像形式(拡張子)を一括でJPGに統一するには、標準搭載されている強力な画像処理コマンド sips を使用するのが最も効率的です。
以下に、特定のフォルダ(およびその中にある子フォルダ)内の画像をすべて .jpg に変換し、元のファイルを削除するスクリプトのサンプルを紹介します。
1. ターミナルで実行するワンライナー
最も手軽な方法です。対象のフォルダに移動して実行してください。
zsh
# 対象のフォルダへ移動
cd /path/to/your/folder
# png, jpeg, JPEG などを一括で jpg に変換
for f in *.{png,jpeg,JPEG,PNG}; do [ -f "$f" ] && sips -s format jpeg "$f" --out "${f%.*}.jpg" && rm "$f"; done
sips -s format jpeg: 画像をJPEG形式に変換します。${f%.*}.jpg: 元のファイル名から拡張子を取り除き、一律.jpgを付与します。rm "$f": 変換が成功した後に元のファイルを削除します(不要な場合は削除してください)。
2. 複数のフォルダ(サブフォルダ)をまとめて処理するスクリプト
階層構造になっている複数のフォルダを一度に処理したい場合は、以下のスクリプトをファイル(例: convert.sh)として保存して実行してください。
bash
#!/bin/bash
# 変換したい親フォルダのパスを指定
TARGET_DIR="./target_images"
# 指定フォルダ内の png, jpeg を探し、1つずつ jpg へ変換
find "$TARGET_DIR" -type f \( -iname "*.png" -o -iname "*.jpeg" \) | while read -r file; do
# 出力ファイル名を作成(拡張子を .jpg に変更)
output="${file%.*}.jpg"
# 変換実行
sips -s format jpeg "$file" --out "$output" > /dev/null 2>&1
# 変換が成功し、かつ元ファイルと別名であれば元を削除
if [ $? -eq 0 ] && [ "$file" != "$output" ]; then
rm "$file"
echo "Converted: $file -> $output"
fi
done
実行方法
- テキストエディタに上記コードを貼り付け、
convert.shとして保存します。 - ターミナルで実行権限を与えます:
chmod +x convert.sh - スクリプトを実行します:
./convert.sh
補足・注意点
- 画質の指定:
sips -s formatOptions 80のようにオプションを追加することで、圧縮率(画質)を調整できます(0〜100、デフォルトは約80)。 - 既存の .jpg: 元々
.jpgという拡張子のファイルは、このスクリプトでは(二重変換を避けるため)処理対象から外しています。 - バックアップ: 大量のファイルを操作するため、実行前にフォルダのコピー(バックアップ)を取っておくことを強く推奨します。
スクリプトではなく、Finderの右クリックメニュー(クイックアクション)から一括変換したい場合は、Automator を使用して「イメージのタイプを変更」アクションを設定する方法も便利です。
処理したいフォルダの構造(1つのフォルダか、階層構造か)や、変換後の画質へのこだわりはありますか?
画質はデフォルトでOKです。フォルダ構造はフォルダの中に1階層だけです。
「親フォルダ > 子フォルダ > 画像ファイル」という1階層の構造ですね。
macOS標準の sips コマンドを使用し、子フォルダ内の .png や .jpeg を一括で .jpg に変換し、元のファイルを削除するスクリプトを作成しました。
1. 実行用スクリプト(保存して使う場合)
以下のコードをテキストエディタに貼り付け、convert.sh という名前で保存してください。
bash
#!/bin/zsh
# 1. 処理したい「親フォルダ」のパスを指定してください
# 例: TARGET_DIR="$HOME/Desktop/MyPhotos"
TARGET_DIR="./対象の親フォルダ名"
# 2. 親フォルダ直下の子フォルダをループ処理
for subfolder in "$TARGET_DIR"/*(/); do
echo "Processing folder: $subfolder"
# 3. 子フォルダ内の png, jpeg, JPEG, PNG を探して変換
# 拡張子が jpg 以外のものを対象にします
for file in "$subfolder"/*.{png,jpeg,PNG,JPEG}(N); do
# 出力ファイル名(拡張子を .jpg に変更)
output="${file%.*}.jpg"
# sipsで変換実行
sips -s format jpeg "$file" --out "$output" > /dev/null 2>&1
# 変換に成功し、かつ元ファイルと別名なら元を削除
if [[ $? -eq 0 && "$file" != "$output" ]]; then
rm "$file"
fi
done
done
echo "完了しました。"
使い方
- パスの書き換え:
TARGET_DIRの部分を作業したいフォルダ名(またはパス)に書き換えます。 - 実行権限の付与: ターミナルで
chmod +x convert.shを実行します。 - 実行:
./convert.shで開始します。
2. ターミナルで即座に実行する(ワンライナー)
スクリプトを作らずに、ターミナルで親フォルダまで移動(cd)してから直接実行する方法です。
zsh
for d in *(/); do for f in "$d"/*.{png,jpeg,PNG,JPEG}(N); do sips -s format jpeg "$f" --out "${f%.*}.jpg" && rm "$f"; done; done
*(/): フォルダ(ディレクトリ)のみを対象にします。(N): 該当する拡張子のファイルがない場合にエラーを出さない設定です。
注意事項
- 上書き確認: このスクリプトは変換後に元のファイルを削除 (
rm) します。念のため、最初はテスト用のフォルダで動作を確認するか、バックアップを取ってから実行してください 1.2.2, 1.3.1。 - 拡張子の統一: 全て小文字の
.jpgに統一されます。
このスクリプトを定期的に使いたい、あるいは特定の画質(圧縮率)を指定したいといったご要望はありますか?
