Macosのzshで、フォルダを圧縮したい。中にはjpgファイルが入っているのだけど、フォルダが階層になっている部分がある。圧縮するのはjpgファイルが入っているフォルだけ。できるかな。

February 19, 2026

MacOSのzshを使用して、

JPGファイルが含まれているフォルダのみを個別に(または再帰的に)圧縮することは可能です。

フォルダ階層を維持したまま、特定の条件(JPGの有無)でフィルタリングして圧縮する方法をいくつか紹介します。

1. JPGが含まれる各フォルダを個別にZIPにする

JPGファイルが直接入っているフォルダを特定し、そのフォルダごとにZIPファイルを作成するコマンドです。

zsh



for dir in **/*(/); do
  if [[ -n $(ls "$dir"/*.jpg 2>/dev/null) ]]; then
    zip -r "${dir%/}.zip" "$dir"
  fi
done
  • **/*(/):現在のディレクトリ以下のすべてのディレクトリを再帰的に探します。
  • ls "$dir"/*.jpg:各ディレクトリ内にJPGがあるかチェックします。
  • zip -r "${dir%/}.zip" "$dir":見つかった場合、そのフォルダ名でZIPを作成します。 

2.JPGファイルのみを抽出して一つのZIPにまとめる(階層維持)

特定のJPGファイルだけを抜き出し、元の階層構造を保ったまま一つのZIPにまとめたい場合は、findコマンドと組み合わせるのが確実です。

zsh

find . -name "*.jpg" | zip -@ result.zip
  • find . -name "*.jpg":JPGファイルだけを再帰的に探し出します。
  • zip -@ result.zip:渡されたファイルリストを受け取り、階層を維持したまま result.zip に圧縮します。 

3. Mac特有の不要ファイルを除外する

MacでZIPを作成すると、Windows等で展開した際に __MACOSX や .DS_Store といった不要なファイルが混入することがあります。これらを除外して圧縮するには -x オプションを追加してください。 

zsh

zip -r output.zip target_folder -x "*.DS_Store" -x "__MACOSX/*"

実行前の注意点

  • テスト実行: 大事なファイルを操作する前に、コピーしたフォルダなどで動作を確認することをおすすめします。
  • 大文字・小文字.jpg と .JPG が混在している場合は、-name "*.[jJ][pP][gG]" のように指定すると両方にヒットします。

作成したZIPファイルをどこに保存したいか(各フォルダ内か、デスクトップかなど)によって最適なコマンドが変わりますが、まずは1つ目の方法がご希望に近いかと思います。

うまくいっています(今テスト中)。ただ、AppleDoubleファイル(._)

February 19, 2026

うまくいっているようで良かったです!

Mac特有のAppleDoubleファイル(._から始まる隠しファイル)は、外部とのやり取りで邪魔になることが多いですよね。

それらを除外して圧縮するには、zipコマンドに -x オプションを追加して、明示的に「ドットから始まり、アンダースコアが続くファイル」を無視するように指定します。

先ほどの1番のスクリプトを改良すると、以下のようになります:

zsh

for dir in **/*(/); do
  if [[ -n $(ls "$dir"/*.jpg 2>/dev/null) ]]; then
    # -x オプションで ._ ファイルと .DS_Store を除外
    zip -r "${dir%/}.zip" "$dir" -x "*/.*"
  fi
done

ポイント

  • -x "*/.*": これを指定することで、フォルダ内の ._filename や .DS_Store といった隠しファイルを一括で除外できます。
  • もしすでに環境変数で COPYFILE_DISABLE=1 が設定されていれば作成されにくいのですが、コマンド側で制御するのが最も確実です。

さらに徹底して除外したい場合は、圧縮コマンドの前に一時的にメタファイルを生成しない設定を加えることもできます:

zsh

export COPYFILE_DISABLE=1
# この後に zip コマンドを実行

テスト中のフォルダで、生成されたZIPの中に ._ ファイルが含まれていないか、unzip -l ファイル名.zip で中身をリスト表示して確認してみてください。

このまま全てのフォルダを一括で処理する段階に進んでも大丈夫そうですか?

大丈夫そうです。ありがとうございました。

February 19, 2026

よかったです!テストも無事に終わったようで安心しました。

最後に一点だけ補足ですが、もし大量のフォルダを処理した後に、作成されたZIPファイルが正しいか不安になった場合は、以下のコマンドでZIPファイルの中身(ファイル名)を一覧表示してサクッと確認できます。

zsh

unzip -l 作成したファイル名.zip

これで ._ ファイルが消えていれば完璧です。

それでは、一括処理頑張ってください!また何かあればいつでも聞いてくださいね。

JPG以外のファイル形式(pngやheicなど)も対象に含めたくなった場合は、またお知らせください。

jpgとjpegが混在しているファイルがありました。

35 minutes ago

jpg と jpeg、さらに大文字の JPG などが混在していても、一括で判定できるようにスクリプトを少し拡張しましょう。 

zshの「ワイルドカード(グロブ)」という機能を使うと、複数の拡張子をまとめて指定できます。

修正版スクリプト

以下のコマンドは、jpgjpeg、さらにそれらの大文字(JPGJPEG)のいずれかが含まれるフォルダを対象にします。

zsh

for dir in **/*(/); do
  # jpg または jpeg (大文字小文字を問わない) があるかチェック
  if [[ -n $(ls "$dir"/*.(#i)(jpg|jpeg) 2>/dev/null) ]]; then
    zip -r "${dir%/}.zip" "$dir" -x "*/.*"
  fi
done

変更のポイント

  1. (#i): これを付けると、それ以降のパターンが大文字・小文字を区別しなくなります(jpg も JPG もヒットします)。
  2. (jpg|jpeg): 「または」を意味する書き方で、両方の拡張子をチェック対象に含めます。
  3. 事前に必要な設定: もしエラーが出る場合は、ターミナルで一度だけ setopt extended_glob を実行してください(zshの高度な検索機能を有効にします)。 

これで、拡張子がバラバラでも「画像が入っているフォルダ」を漏れなく圧縮できるはずです。 

もし特定のフォルダだけ除外したい、あるいは圧縮後に元のフォルダを削除したいといった追加のご要望があれば、教えてくださいね。