📦

macOSで特殊ファイルを一切含まないアーカイブを作成する

3 min read

概要

macOS で作成された tarball や zip を、 Windows などの他の OS で展開・解凍すると下のような不可解なファイルが含まれていることがよくあります。


.DS_Store や ._ がたくさんある

.DS_Store はよく見るやつですが、._ (ドットアンダースコア) ファイルは Windows 上では拡張子も表示されるため、一見ダブルクリックで開けそうなのでユーザーは混乱してしまいます。


当然、実際には開けません

この現象への対処方法としてネット検索で最もよく出てくるのが COPYFILE_DISABLE=1 です。

% env COPYFILE_DISABLE=1 tar zcvf sample.tgz sample/

ただし、これでも .DS_Store ファイルを排除することはできないので明示的に除外する必要があります。

% env COPYFILE_DISABLE=1 tar cvf sample.tgz --exclude=".DS_Store" sample/

これで完璧なように見えますが、さらに問題があります。Windows や Linux のターミナル (=bash など)で上の sample.tgz を展開すると以下のように表示されます。

bash
$ tar xvf sample.tgz

sample/
sample/001.jpg
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.quarantine'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.lastuseddate#PS'
sample/IMAG0138.jpg
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.macl'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.lastuseddate#PS'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.LaunchServices.OpenWith'

xattr (=ファイル拡張属性) が残っているのです。ファイル拡張属性を macOS 上で確認するには ls -l コマンドを使います。

zsh
% ls -l

total 21920
-rw-r--r--@ 1 zenn  staff    68539 11 29 08:32 001.jpg
-rw-r--r--@ 1 zenn  staff  1255590 11 29 08:32 1560055850624954.webp
-rw-r--r--@ 1 zenn  staff  1264733 11 29 08:32 612c29f51bb2.png
-rw-r--r--  1 zenn  staff  3720213 11 29 08:32 IMAG0138.jpg
-rw-r--r--@ 1 zenn  staff  4147919 11 29 08:32 IMAG0141.jpg
-rw-r--r--@ 1 zenn  staff   111410 11 29 08:32 cd5fa316.jpg
-rw-r--r--@ 1 zenn  staff   175945 11 29 08:32 wallpaper-light-01.jpg

パーミッションの @ は、拡張属性(Extended Attributes、略称 xatt)と呼ばれ、OS 固有の特殊なファイル属性が付加されていることを表す記号です。

これを取り除くには、アーカイブにあらかじめ xattr コマンドを実行しておく必要があります。

zsh
% xattr -rc sample/
  • -r: 引数のファイルがディレクトリの場合、ディレクトリ内の全てのファイルに再帰的に適用されます。
  • -c: 関連する値を含む、すべての属性が削除されます。

結論

上記の一連のコマンドが長くなってしまうので、シェルのエイリアス関数にしてしまったほうが良いかもしれません。

.zshrc
mtgz() {
  if [ $# -lt 2 ]; then
    echo "Usage: mtgz DIST SOURCE"
  else
    xattr -rc ${@:2} && \
    env COPYFILE_DISABLE=1 tar zcvf $1 --exclude=".DS_Store" ${@:2}
  fi
}

使い方:

% mtgz sample.tgz sample/

sample/
sample/001.jpg
sample/1560055850624954.webp
sample/cd5fa316.jpg
sample/E8-iHkRVkAMBEt5.jpg
sample/Electron_Logo.svg
sample/IMAG0138.jpg
sample/IMAG0141.jpg
sample/penguin256.png
sample/vi302033039412130210357.png
sample/wallpaper-dark-01.jpg
sample/wallpaper-light-01.jpg

参考にした記事

https://qiita.com/KEINOS/items/e218c4d8da5451c9e59c

https://stackoverflow.com/questions/4833052/how-do-i-remove-the-extended-attributes-on-a-file-in-mac-os-x

Discussion

ログインするとコメントできます