結論から
% xattr -cr <directory>
これで指定したディレクトリ以下にあるファイルの拡張属性をすべてクリア (c) できます。
ただし確認は El Capitan でのみやっています。手元にある Mavericks にも -c
オプションと -r
オプションがありましたので同様に動作すると思われます。これ以前のバージョンでは xattr
に -r
(ディレクトリ再帰降下) オプションがないかもしれません。
拡張属性 (EA) とは
ls -l
したときにパーミッションの右側に @
マークがついていることがあります。これは HFS Plus (OSX のデフォルトのファイルシステム) の拡張属性 (EA: Extended Attributes) がそのファイルについていることを示します。たとえばメールの添付ファイルを保存したときにどのメールアドレスから受け取ったファイルなのかとか、そういう情報が記録されています。
EA についての概要はマイナビニュースの OS X ハッキング! Leopard解体新書(4) ~拡張された拡張属性~ を参照してみてください。古い文書ですが大変有用です。
EAが悪さをする
EA がついたままファイルを圧縮して他の OS のユーザーにそれを渡すと、拡張属性が別ファイルとなって渡されます。丁度 .DS_Store
みたいな感じにです。他人とやり取りするときはほぼ必要ない情報ですから消したいところです。
実例
% ls -lR
total 192
-rw-r--r--@ 1 tura staff 98207 Feb 10 11:42 a.jpg
drwxr-xr-x 3 tura staff 102 Feb 10 11:43 b/
./b:
total 192
-rw-r--r--@ 1 tura staff 98207 Feb 10 11:43 b.jpg
-rw-r--r--@
と右端に @
がついていますよね。これが拡張属性がついている印です。指定したディレクトリ以下のファイルに付いた拡張属性を一気に消す方法は
% xattr -cr <directory>
です。以前は find
やらなんやらと xattr
を組み合わせないとできなかったようですが、少なくとも El Capitan の xattr
には -r
オプションがあります。これは指定されたディレクトリ以下を再帰的に辿って適用するオプションです。
これと find . -name '.DS_Store'|xargs rm
は Makefile や Rakefile などの 擬似ターゲット/タスク に記述していつでも消せるようにしておきましょう。他社へ渡すアーカイブファイルを作るタスクの依存タスクにこの消すタスクを指定しておけば完璧です。
参考文献
-
Macでlsした時のパーミッションにあるアットマークを消す。xattrコマンド。 Leopard の頃は
-r
オプションがなかったようです - ls -lした時に@(アットマーク)がパーミッションの所についた時にカレントディレクトリ以下をまとめて消すワンライナー これをみてうわめんどくせえと思って man を見てみると簡単な解決策を見つけたのでした (先に man 読めよな)