ditto で zip圧縮する

zip コマンドで圧縮することが出来ます。簡単ですが罠があります。zip コマンドを使わず、ditto を使いましょう。

zip の罠

zip コマンドは簡単で、フォルダならこんな感じで zip圧縮ファイルを作成できます。

zip -r posix.zip posix/

フォルダの圧縮には -r オプションを付け、ターゲットのフォルダパスでは最後に “/” を付けます。付けなくてもできましたが付けろということです。

オプションにはパスワードを付ける -e や、ディレクトリ構造を無視する -j などがあります。

コマンドは簡単ですが、ただしこれには罠があります。こうやって作った zip ファイルを他環境で解凍すると、Usersフォルダ以下、すべての階層フォルダがモロ出しで展開されます。

Users、ユーザー名、フォルダ、フォルダ… と、すべての階層のフォルダがモロ出し


圧縮した環境内で解凍すれば普通にターゲットフォルダのみが展開されるのでこの罠に気付きません。他環境で解凍して初めて気付きます。

ターゲットのフォルダ内にファイルだけがある状況なら -j が役に立つかもしれませんが、サブフォルダがある場合に不向きだし、フォルダをまたがって同じファイル名が存在しているとエラーが出ます。条件がいちいち面倒だから -j は却下。

zip コマンドは、Finder のコンテキストメニューから「”〜〜”を圧縮」で圧縮するのとは全く意味が異なる挙動をすると知りました。

それで、どうすれば良いのかを誰かに訊きました。答えを得るのに苦労しましたが、結果は ditto を使うことです。

ditto コマンドを使う

圧縮してzipを作成する

ditto は、指定ディレクトリをコピーするコマンドです。バックアップなどに威力を発揮するようです。このコマンドを使って zip 圧縮もできるのでして、こっちは Finder のコンテキストメニューから圧縮するのと同じ働きをします。呪文はこうです。

ditto -c -k --sequesterRsrc --keepParent '元のフォルダパス' '圧縮ファイルパス.zip'

-c はコピー、-k は何とかという方法でzip圧縮するオプションだそうです。

–keepParent オプションは、ファイルを圧縮するときには外します。でないとファイルの真上の階層がくっ付いてしまいます。フォルダ圧縮のときのみ使います。

–sequesterRsrc は「PKZipアーカイブを作成する場合、リソースフォークを保存し サブディレクトリ__MACOSXにHFSのメタデータを格納。 PKZipで抽出すると、これらのリソースが自動的に見つかります」ということで、人によっては「余計なファイルをくっつけてくる」と考えるアレのことでしょうか。

展開する

展開するにはこうです。

ditto -x -k 'zipファイルのパス.zip' '展開する場所フォルダパス'

展開する場所は、解凍後フォルダを格納するフォルダを指定すればいいと思います。

 

今まで zip コマンドがややこしくて避けていました。余計なフォルダがくっついたり、FileMakerから使うと変なエラーで動かないなど、まともに使えませんでした。

ditto コマンドによりフォルダを圧縮・展開することがとても簡単にできるようになりました。

ところでディレクトリをコピーするとき、cp と ditto の違いがあるでしょうか。早速ChatGPTに訊ねてみたところ次のような回答を得ました。

コピーにおける cp と ditto の違い

`cp`と`ditto`は、どちらもファイルやディレクトリをコピーするために使用されるコマンドですが、いくつかの違いがあります。

`cp`は、基本的にはファイルやディレクトリを単純にコピーするだけであり、ファイルの属性やメタデータを保持することができます。一方、`ditto`は、デフォルトでファイルの属性、メタデータ、およびリソースフォーク(MacOSで使用される非常に古いリソースファイルフォーマット)をコピーすることができます。これにより、MacOS特有のファイルシステム機能を使用している場合に、より適切なコピーが可能になります。

また、`ditto`は、ディレクトリの再帰的なコピーに対してより優れたパフォーマンスを発揮する場合があります。これは、複数のファイルを同時にコピーできるためです。

一方、`cp`は、POSIX標準に準拠しているため、他のUnix系のOSでも使用することができます。また、`cp`は標準でインストールされているため、`ditto`よりも一般的に使用されます。

どちらが有利、より良いかは、使用目的や環境によって異なります。ただし、一般的に、MacOS上でファイルをコピーする場合は、`ditto`がより適切な選択肢である場合があります。

 なるほど、cp では古いファイルの情報が消え失せるとのことですが、それが本当ならコピーには ditto 使用が必須になります。でもそうでしたっけ?これって、MacOSX のいくつかのバージョンで解消されたように思いますが気のせいだったかな?

Penguin icon この件、cp に限らず mv とか rsync とかも含め、軽く検索した程度では事実を把握することができませんでした。よくわからないので保留にしておきます。ditto なら確実ということだけは判った。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください