現在でこそシステム管理と直接の関係はないものの、かつては大量のファイルを磁気テープに保存するために利用された「アーカイバ」。シリーズ5回目となる今回は、その代表格ともいえるzipコマンドの気の利いた使いかたを紹介しよう。

コマンドでzip圧縮する理由

インターネット回線の帯域が細かった昔は、メールにファイルを添付するときは"圧縮"することが常識。現在では帯域を気にする必要はなくなり、相手のメールサーバに弾かれないサイズに収めればよしとされるが、たくさんのファイルを添付すると嫌がられることに変わりはない。データが小さくなる効果より、1つのファイルとして書庫化(アーカイブ)することに価値があるのだ。

ご存知のとおり、macOSのFinderにはZIPと連携する機能が用意されている。ファイルを選択した状態でコンテキストメニューを表示し、「○○○を圧縮」を選択すればOK。そのフォルダ上に「アーカイブ.zip」という名のZIPファイルが生成される。あとは適当にリネームすればいい。

しかし、これでは十分でない。理由は1つ、アーカイブ.zip内に「Macユーザ以外には無関係のフォルダ」が作成されてしまうからだ。この書庫ファイルを受け取った側のシステム設定にもよるが、WindowsなどMac以外のOSでは展開後に「__MACOSX」という謎のフォルダが出現し、相手を混乱させることになる。

このフォルダには、ファイルから分離された「リソースフォーク」が格納される。macOS標準のファイルシステム(APFS/HFS+)では、ファイル本体(データフォーク)のほかにリソースフォークという領域を設け、ファイルの付随情報を格納しておくが、これは同じAPFS/HFS+およびリソースフォークを扱えるアーカイバが用意されていなければ復元できない。非Macユーザが受け取ってもほとんど意味はなく、渡す前に取り除くことが賢明な措置だ。

  • FinderではコンテキストメニューからZIPアーカイブを作成できるが……

  • Finderの機能で作成した「アーカイブ.zip」をQuickLookしたところ(The BetterZip Quick Look Generatorを使用)。「__MACOSX」フォルダが見える

Finderの機能では、この「__MACOSX」フォルダなしにZIPアーカイブを作成することはできないが、Terminalから「zip」コマンドを実行すれば対応できる。デフォルトでリソースフォークなしのZIP書庫を作成するが、カレントディレクトリ以下を再帰的に書庫化する「-r」オプションとセットで利用するもの、と覚えておいたほうがいい。具体的には、以下のような書式で使うことになるだろう。

$ zip -r 作成する書庫.zip 対象ファイル/ディレクトリ...

コマンドに抵抗があるという場合には、Finderからのドラッグ&ドロップで書庫化するファイルを指定するといい。「zip -r ○○○.zip」までは手入力する必要があるものの、対象ファイル/ディレクトリはTerminalの画面目がけてFinderからドラッグ&ドロップすればOKだ。複数ある場合、スペースで区切り列挙すればいい。

ただし、Finderからドラッグ&ドロップしたファイル/フォルダは「/Users/shinobu/Desktop/abc.txt」のようにフルパスで登録されてしまうため、受け取った側はフォルダ構造を深く掘り下げないと目的の書類を見つけられない。そうならないようにするためには、cdコマンドで目的のファイル/フォルダに移動し(カレントディレクトリを変更)、シェルの入力補完機能を使うなどしてファイル名を手入力したほうがいいだろう。

  • Terminalへファイルをドラッグ&ドロップする方法もあるが、解凍後フォルダを掘り下げて書類を取り出すことになるので注意

アーカイブ対象にフォルダが含まれないのであれば、前述したパスの問題を回避できる方法がある。それは「-j」オプションを使うこと。このオプションを指定すれば、対象とするファイルのパスを無視してアーカイブしてくれる。つまり、「zip -j 」とだけ入力してTerminal画面へファイルを次々ドラッグ&ドロップすれば、フォルダなしのフラット構造のZIPファイルを作成できるのだ。フォルダによる分類はできなくなるが、アーカイブ対象のファイルが10以下であれば問題にはならないだろう。

  • 「-j」オプションを使うと、フォルダ構造を保てないかわりにドラッグ&ドロップによるフルパス問題を回避できる

「.DS_Store」を取り除く

非Macユーザに受けが悪いもうひとつの要素が「.DS_Store」だ。Finderのメタ情報が記録されるドットファイル(先頭がピリオドで始まるファイル/フォルダ)であり、UNIX系OSでは伝統的に不可視属性として扱われるため、Finderの画面上には表示されない。しかし、フォルダを開くたびに作り直される(なければ新規作成)ため、いざ消そうとすると厄介な存在だ。

そんなときは「-d」オプションを使おう。書式は以下のとおりで、「-d」に続けて対象のZIPファイルを指定し、最後に「"*.DS_Store"」を入力する。これで、対象のZIPファイルに含まれる「.DS_Store」をまとめて取り除くことができる。

$ zip -d iroiro.zip -x "*.DS_Store"
  • 作成済のZIPファイルから「.DS_Store」をまとめて取り除くことができる