こんなときにドットファイルが"ウザい"

仕事の道具にMacを選ぶと、ある種の"覚悟"が必要になる。iPhone/iPadが大ヒットした影響かMacユーザが増え、ここ数年で多少緩和されたにせよ、圧倒的多数派のWindowsユーザに合わせなければならないことに変わりはない。

言ってしまえば、この世の中「表計算ソフトはExcelでプレゼンツールはPowerPoint」なのだ。NumbersやKeynoteの書類を渡せば、かなりの確率で問い合わせがくる。そんな面倒を背負い込むくらいなら多数派に合わせてしまおう、悲しいかなMacユーザにはそのような習慣が身につく。

とはいえ、毎度そのような迎合主義では済まない。ファイルフォーマットは相手に合わせることで対処できるが(というよりそうするしかない)、知らず知らずMacの独自ルールを相手に押しつけていたとしたら……「ドットファイル」はそのひとつだ。

ドットファイルとは、名前の先頭が「.」(ASCII文字のピリオド)で始まるファイル/フォルダのこと。UNIX系OSにはドットファイルを不可視属性とみなす慣習があり、OS Xもそれを引き継ぐ。しかも、OS Xではメタデータなどファイルの付帯情報を別ファイルとして分離する機構(Apple Double)があるため、FAT32やexFATなどHFS+以外のファイルシステムにファイルを保存すると同名のドットファイル -- ABC.xlsであれば「._ABC.xls」-- が自動作成されてしまい、なんですかこれは、と面倒な質問を受けるはめになる。

もちろん、Apple Doubleの「._○○○」は不要なわけではないが(OS Xで読み取るときには参照される)、Windowsなど他のOSのユーザに必要とされないことは確か。エクスプローラなど多くのファイルブラウザも、ドットファイルは表示されない仕様だが、見えないだけで存在するため、ふとしたときに問題となるのだ。

たとえば、以下の図はWindowsで作成したZIPファイル(FAT32でフォーマットされたUSBメモリ上のフォルダをそのまま圧縮)だが、内容物はOS Xで作成したため、すべてのファイルに対し「._○○○」が作られてしまっている。デジタル家電も例外ではない。USBメモリから音楽ファイルを読み取るタイプのオーディオ機器で、OS Xでコピーした楽曲に「._○○○」が付いてしまい、閉口した経験を持つ人もいるはず。ファイルをMacの外へ出すと決めたら、「._○○○」は取り除いたほうがいいのだ。

Macで作成したファイル(保存場所はFAT32で初期化したUSBメモリ)をWindowsで圧縮したが、それでも「._○○○」が含められてしまう

dot_cleanコマンドの使いかた

前置きが長くなったが、これを解決する方法はTerminalで「dot_clean」コマンドを実行すること。引数にカレントディレクトリを意味する「.」を与えて実行すれば、下位のディレクトリを再帰的に検索、Apple Doubleとして分離されたファイルが存在する場合はそれを取り除いてくれる。引数を「/Volumes/USBMEM」などとマウントポイントにすれば、外部ストレージ全体を対象とすることも可能だ。

実際のところ、dot_cleanコマンドはデフォルトのオプションとして「--keep=mostrecent」を利用している。その意味するところは、データフォークと関連付けられた属性情報(EA、Extended Attributes)がある場合はそれを利用し、ない場合は「._○○○」(Apple Doubleファイル)に保存されている情報をデータフォークに反映したうえで、「._○○○」を削除する。

カレントディレクトリ以下の「._○○○」を削除する

$ dot_clean .

外部ストレージ全体を対象に「._○○○」を削除する

$ dot_clean /Volumes/USBMEM

「dot_clean .」を実行したところ、カレントディレクトリ以下のフォルダを対象に(再帰的に)「._○○○」が削除された

dot_cleanコマンドを利用する場合、おそらく「._○○○」を取り除くことが最大の目的だろうから、これを残すという選択肢はないかもしれない。しかし、このコマンドはEAやリソースフォークの情報をデータフォークに反映させることが本来の目的であり、「._○○○」を残すというオプションも用意されている(表参照)。たとえば、以下のとおりコマンドを実行すると、「._○○○」が存在する場合でも無視してデータフォークの情報を利用し、「._○○○」を削除できる。

$ dot_clean --keep=native /Volumes/USBMEM
dot_cleanコマンドのオプション
-f 再帰的な削除を行わない
-m つねに「._○○○」を削除する
-n 分離元のファイル(データフォーク)が存在しない場合にのみ「._○○○」を削除する
-p 「._○○○」を残す
-s シンボリックリンクを追跡する
--keep=mostrecent 属性情報(EA)を優先的にデータフォークへ反映し、なければ「._○○○」を反映させたうえで削除する(デフォルト)
--keep=dotbar 「._○○○」を優先的に反映させEAと置き換えたうえで、「._○○○」を削除する
--keep=native 「._○○○」が存在する場合でも無視してデータフォークの情報を利用し、「._○○○」を削除する