blog.hekt.org

複数のファイルやフォルダを個別にZIP圧縮するAutomatorサービス

少し前に某所にドヤ顔で書き込んだものの実は使えるレベルじゃなかったのでここでリベンジ。

普通に複数選択してアーカイバーに渡すとすべてまとめてZIPにしてしまうので、ひとつひとつ選択してやらなきゃならないのですが、これでその手間を省けます。個別圧縮に対応したアーカイバーもありますが、より手軽な方法ということで。

Automatorでサービスを作る

  • 書類の種類を選択してください:サービス
  • “サービス”は、次の選択項目を受け取ります:ファイルまたはフォルダ
  • 検索対象:Finder(またはすべてのアプリケーション)

シェルスクリプトを実行:

  • シェル:/bin/bash
  • 入力の引き渡し方法:引数として
for f in "$@"
do
	# 対象のファイル名を取得
	name="${f##*/}"
	# 対象のファイルがあるディレクトリのパスを取得
	path="${f%/*}"
	cd "$path"
	zip -r "$name" "$name"
done

-rはカレントディレクトリ以下のディレクトリ構成を再現して圧縮するオプションです。これをしないとサブディレクトリを圧縮できないみたい。

(後から読んだ自分が)分かりやすいようにパスやファイル名を変数に格納しましたが、省略してもOK。

for f in "$@"
do
	cd "${f%/*}"
	zip -r "${f##*/}" "${f##*/}"
done

失敗作

for f in "$@"
do
	zip -r "${f%.*}" "$f"
done

最初はこれでいけるかなーと思ったのですが、これだとルートディレクトリからのディレクトリ構成すべてが再現されて酷いことになります。つまりhogeというディレクトリを圧縮しようとして”~/Downloads/hoge”にサービスを適用すると、”Users/USERNAME/Downloads/hoge/…”という構成で圧縮されてしまいます。

あと、拡張子をわざわざ取り除かなくても勝手に変えてくれるみたい。

……と、まあしょーもない失敗もありましたが、Automatorはすっげー便利なのでもっと流行るべき。シェルスクリプトとしてPerlやPython、Rubyも実行できるよ!