macOSで作業しています。フォルダ内に画像が沢山入っているフォルダがいくつかあります。jpgとpngが混在しています。中にはjpegというのもあります。全てjpgに統一したいのです。スクリプトを組みたいのですが、サンプルをお願いします。

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

実行方法

  1. テキストエディタに上記コードを貼り付け、convert.sh として保存します。
  2. ターミナルで実行権限を与えます:chmod +x convert.sh
  3. スクリプトを実行します:./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 "完了しました。"

使い方

  1. パスの書き換えTARGET_DIR の部分を作業したいフォルダ名(またはパス)に書き換えます。
  2. 実行権限の付与: ターミナルで chmod +x convert.sh を実行します。
  3. 実行./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 に統一されます。 

このスクリプトを定期的に使いたい、あるいは特定の画質(圧縮率)を指定したいといったご要望はありますか?