ditte で zip圧縮する

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

zip の罠

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

zip -r posix.zip posix/

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

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

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

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


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

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

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

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

ditto コマンドを使う

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

ditto -c -k --sequesterRsrc --keepParent 'フォルダパス' '目的ファイル.zip'

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

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

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

今まで zip コマンドがややこしくて避けていましたが、上記の 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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください