水たまりは希望を写している

【macOS】7z 圧縮ファイルを作成するショートカットで Finder から圧縮できるようにする

Finder のクイックアクションメニューと、「7z ファイルに圧縮」のテキスト。

Windows & macOS 間の圧縮ファイルのやりとりに ZIP ではなく 7z はいかが? というお話」という記事を公開した。この記事にあるとおり、macOS の Finder から 7z 形式でファイルを圧縮することはできない。

しかし、macOS には bsdtar が導入されているため、ターミナルからは 7z ファイルを作ることができる。これを、macOS のオートメーションアプリの「ショートカット」を使って Finder から 圧縮できるようにしてみよう

ショートカットの内容

作成する内容は以下の通り。そのまま愚直に 7z ファイルを作成するタイプと、Windows に不要なリソースフォークと .DS_Store を除去して圧縮するタイプの 2 パターンのスクリプトがある。好きな方を使って良いし、2 つともショートカットを作成してもよい。

  • クイックアクション」から「ファイル、フォルダ」の入力を受け取る
  • 変数「paths」を「ファイルパス (クイックアクション)」に設定
  • シェルスクリプトを実行
    • シェル zsh
    • 入力 paths
    • 入力を渡す方法 引数として
  • 通知「シェルスクリプトの結果」を表示
common=$(dirname "$1")
for file in "$@"; do
  dir=$(dirname "$file")
  while [[ "$dir" != "$common"* ]]; do
    common=${common%/*}
  done
done

relative_files=()
for file in "$@"; do
  relative_files+=("${file#$common/}")
done

tar -acf "$common/アーカイブ.7z" -C "$common" "${relative_files[@]}"
common=$(dirname "$1")
for file in "$@"; do
  dir=$(dirname "$file")
  while [[ "$dir" != "$common"* ]]; do
    common=${common%/*}
  done
done

relative_files=()
for file in "$@"; do
  relative_files+=("${file#$common/}")
done

tar --disable-copyfile --exclude='.DS_Store' -acf "$common/アーカイブ.7z" -C "$common" "${relative_files[@]}"

このシェルスクリプトは、引数に渡されたファイルを、bsdtar を使用して 7z 形式に圧縮する。ショートカットから渡されるファイルパスは絶対パスで、そのまま tar コマンドに渡すと展開したときに関係ないディレクトリまで作成されてしまうので、共通するファイルパスの分は除去するようにしている。

シェルスクリプトを実行するには、「ショートカット」アプリ自体がスクリプト実行を許可する必要がある。これはショートカット作成の際に許可を求められる。また、Finder 上で使えるようにするために、「クイックアクションとして使用 : Finder」にチェックを入れる。これを実行するとファイル・フォルダを選択して右クリックをすると「クイックアクション」からこのショートカットを呼び出せるようになる

Finder から実行するには追加の設定が必要

このショートカットを今 Finder から呼び出しても、エラーが発生する。usagimaru 氏の Zenn によると Sonoma 以降から権限が足りないようで (Monterey では何事もなく動いた)、多分記事通りにやれば解決する。さらに調べてみると、Finder.app にフルディスクアクセス権限を与えても解決するようなので、今回はこちらで対応する。

システム環境設定→プライバシーとセキュリティ→フルディスクアクセスに、Finder.app を追加する。Finder.app は、\システム\ライブラリ\CoreServices\Finder.app にある。

ここまで設定すると、Finder でファイルを選択しているときのクイックアクション (右クリックメニュー) からショートカットを実行して、7z ファイルを作成することができる。

この記事を書いた人

AioiLight

Web とか Android とかをやってる人。アニメ・ゲームが好きなはずなのに消費しきれない毎日。

Twitter (@aioilight)