いまも「ZIP」が使われる理由

少し前のニュースだが、ISDNのデータ通信サービスが2020年度後半にも終了予定だという。NEXTSTEPを使っている頃はフレッツISDNだったなあ、などと往時を振り返りつつ、目の前のデスクトップに当時と変わらぬファイルがあることに気がついた。ZIPファイルだ。LHA/LZHはほとんど目にしなくなったが、ZIPはバリバリの現役と言っていい。

いまなおZIPなどアーカイバは多くのユーザに利用されている。その最大の理由は、おそらく「書庫化」だろう。ナローバンドの時代、ファイルを圧縮せずにメール添付しようものなら非常識呼ばわりされたものだが(少し大げさ?)、帯域がリッチになり受信可能なメールサイズも拡大されている現在、スプレッドシートやワープロ文書を未圧縮のまま添付しても責められることはない。

しかし、小さなファイルを20も30も添付したら……そう、データサイズよりも相手が扱いやすいことのほうが重要な時代なのだ。

だからこそ、ZIPに"奇妙な"ファイルを混ぜてはいけない。受け取った人が混乱するからだ。「_MACOSX」フォルダとか、「.DS_Store」とか、その他の先頭が「.」で始まるファイルとか……多くのMacユーザが思いあたるのではなかろうか。

とはいえ、同じMacユーザ同士であれば「__MACOSX」フォルダ -- AppleDoubleのデータフォーク以外の部分、リソースフォーク+メタデータが収められている -- はあったほうがいい。「.DS_Store」はそもそもが不可視だから、あったところで気付かれない。あくまで「WindowsユーザあるいはOSの違いに関係なく受け入れられるZIP」を目指す、という意味合いで理解していただきたい。

Finderのコンテキストメニュー経由で作成したZIPファイル。「__MACOSX」フォルダもドットファイルも収録されてしまう

実はかんたんだった、ドットファイル抜きのZIP作成術

実は、同じテーマを第30回で取りあげたことがある(リンク)。そのときは、以下にあげる2行のコマンドラインを「型」として提示することで、一応の解決をみたと考えていたのだが、少々詰めが甘かった。

$ find . -name '.DS_Store' -print0 | xargs -0 rm
$ zip -r ○○○.zip file1.xxx file2.xxx ...

問題は、やはりといおうか、コマンドラインが2行あること。まずはfindコマンドでカレントディレクトリ以下の「.DS_Store」を検索&削除し、その後zipコマンドでファイル/ディレクトリを書庫化しようというわけだが、できれば1行で済ませたい。

となれば、zipコマンドの「-x」オプションを利用して「.DS_Store」を除外する方法(zip -r ○○○.zip * -x *.DS_Store)がスマートか? と思いきや、macOS Sierraに収録のzipコマンド(v3.0)では、ドットファイルは自動的に除外される仕様らしい(以前のOS Xはそうでなかったと記憶しているのだが)。

確かに、書庫作成時にワイルドカードを使用すると、カレントディレクトリにあるすべてのドットファイル/ディレクトリは無視される。Finderの機能(コンテキストメニューの「"○○○"を圧縮」)でZIPを作成するときとは異なり、「__MACOSX」フォルダが作成されないことは把握していたが、この仕様は気付かなかった……つまり、「WindowsユーザあるいはOSの違いに関係なく受け入れられるZIP」は、たったこれだけのコマンドラインで作成できる。findもxargsも、特に実行する必要はない。

$ zip -r ○○○.zip *

なにもしなくても「.DS_Store」はZIP書庫に含まれていなかった……

ただし、この挙動はHFS Plusで実行したときの話。FAT32などそれ以外の領域では、リソースフォークとメタデータは「._」から始まる同名ファイルに分離される仕様のため(Apple Double)、「dot_clean」コマンドを実行して取り除かなければならない。よって、今回のお題の完成形は以下のコマンドラインということになる。

$ dot_clean . ; zip -r ○○○.zip *

FAT32などHFS Plus以外の領域では、「._」から始まるファイルも混入してしまうが、dot_cleanコマンドを実行すると取り除ける

そうなると、意図してドットファイル/ディレクトリを書庫に含めるときにはどうするかという疑問が生じるが、明示すればいいらしい。たとえば、カレントディレクトリにあるすべての可視ファイル/ディレクトリ(再帰的)に「.bashrc」と「.viminfo」を含めたいときは、以下のとおりzipコマンドを実行すればOKだ。

$ zip -r ○○○.zip * .bashrc .viminfo

ところで、zipコマンドのオンラインマニュアルに目を通すと、「--system-hidden(省略形は「-S」)」オプションについて言及されている。このオプションを指定すると、ドットファイルを明示しなくても書庫に含まれるとのことだが、いざ試してみると「Invalid command arguments (long option 'system-hidden' not supported)」とエラーが発生してしまった。

調べてみると、このオプションが使えないことは何年も前から確認されているが、修正はされていないらしい。使えなくてもそれほど困ることはなさそうだが、複数のドットファイルを書庫に収録するときには気をつけよう。