macOSのFinderにはファイルやフォルダを圧縮してZipファイルを作る機能が入っています。このZipファイルはWindows上で作成するZipファイルとは少し異なります。
このFinderで作られるZipファイルと同じ方式のZipファイルはターミナルからも作成できます。シェルスクリプトから実行すれば、自動処理の中で行うこともできます。
この記事では、Finderで作成されるZipファイルと同じ方式のZipファイルを作る方法と、そのZipファイルを展開する方法を解説します。
Finderの右クリック「○○を圧縮」と同じ方式のアーカイブを作る
Finderで右クリックして、「○○を圧縮」を選択したときと同じ方式のアーカイブを作るには、dittoを使います。
$ ditto -c -k --sequesterRsrc --keepParent Test Test.zip
Testフォルダを圧縮してTest.zipファイルを作ります。
-cオプションはアーカイブ作成、-kオプションはPKZipを使って圧縮、--sequesterRsrcオプションは、リソースフォークとHFSメタデータを__MACOSXというフォルダを作って保護するオプションです。--keepParentオプションは親ディレクトリを維持します。
ファイルだけを指定したとき
ファイルを一つだけ指定して、Zipファイルを作るときは、--keepParentオプションが邪魔になることがあります。例えば、デスクトップに123.jpgファイルがあり、次のようにしてZipファイルを作ります。
$ ditto -c -k --sequesterRsrc --keepParent 123.jpg 123.zip
これを展開すると、Desktop/123.jpgが展開されます。Desktopという余分なフォルダが作られてしまいます。
--keepParentオプションで123.jpgの親ディレクトリであるDesktopが入ってしまったのです。
ファイル単体で圧縮するときは、--keepParentオプションを外すと上手く動きます。
但し、アプリの場合は例外です。MacのアプリはFinderではファイルのように見えますが、実体はフォルダです。そのため、--keepParentオプションを外すと、正しく圧縮できません。
作成したZipファイルを展開する
dittoはZipファイルを作るだけではなく、展開もできます。Finderと同じ方式のZipファイルを展開するには、次のようにします。
$ ditto -x -k TextEdit.zip ./
上記の例では、TextEdit.zipファイルをカレントディレクトリに展開します。./を展開先のディレクトリに置き換えると、ディレクトリを作って、その中に展開します。
-xオプションはアーカイブの展開を行うオプションです。-kオプションで展開するZipファイルのフォーマットがPKZipの形式だということを指定しています。
Finderと完全一致ではない
dittoで作成したZipファイルですが、Finderと完全一致ではありません。試してみると分かるのですが、ファイルサイズが若干異なります。dittoのmanにも次のように書かれています。
The command: ditto -c -k –sequesterRsrc –keepParent src_directory archive.zip will create a PKZip archive similarly to the Finder’s Compress function- ality.「similarly」とあるように、「同じ」ではなく「類似した」アーカイブになるという機能です。実用上は問題になったことはありませんが、全く同じアーカイブが出来上がるということではないです。











