Macでlsした時のパーミッションにあるアットマークを消す。xattrコマンド。

CakePHP 1.3.4がリリースされた様なのでダウンロードしました。
それはそれとして、Macで何かダウンロードしたファイルを ls コマンドで見ると、パーミッションの右に謎の @ があります。
MacBookにMongoDBをセットアップしてみた。 - kanonjiの日記 でも軽く消し方を書いたんですが、その時とはちょっと変わったのでまとめます。

環境

Mac Mac OS X 10.5.8(Leopard

@ の正体

EA (Extended Attributes)とは

Leopardの話に入る前に、Tigerで導入されたファイルリソース「EA (Extended Attributes)」について説明しておこう。ACL(Access Common List)もTigerからサポートされたが、デフォルトでは無効化されているため、ここでは省略する。

EAは、メタデータと総称されるファイル付加情報の1つ。ファイル名とパーミッション、ファイル作成日を除くさまざまな情報が記録され、Spotlightによる検索などに用いられる。そもそもHFS Plusは、データフォークとリソースフォーク以外のフォークを確保できるよう設計されていたが、実際には利用されてこなかった。EAが実装されたことにより、ユーザやアプリケーションが自由に、ファイルの本質とは直接関係のない修飾的な情報を保存できるようになったのだ。

http://journal.mycom.co.jp/column/osx/253/index.html

Extended Attributes という名前のものらしい。
Appleでこれについてのドキュメントを、さらっと探してみたけど見つからなかった。

$ ls -l cakephp-cakephp-1.3.4-0-g703344c.zip 
-rw-r--r--@ 1 kanonji  staff  1463815  9 12 20:24 cakephp-cakephp-1.3.4-0-g703344c.zip

ダウンロードしてきたファイルを見ると、パーミッションの横に @ があります。

$ ls -l@ cakephp-cakephp-1.3.4-0-g703344c.zip 
-rw-r--r--@ 1 kanonji  staff  1463815  9 12 20:24 cakephp-cakephp-1.3.4-0-g703344c.zip
	com.apple.metadata:kMDItemWhereFroms	    158 
	com.apple.quarantine	     89 

-@ オプションで、どんな Extended Attributes が付いてるかを確認できます。

Extended Attributesの消し方

com.apple.quarantine はダウンロードしてきたファイルに付くものらしいけど、com.apple.metadata:kMDItemWhereFroms はなんだろうと思って色々調べてみました。
どうやらそうらしいと言う程度だけど、こっちもダウンロードしてきたファイルに付くものらしい。

$ xattr -d com.apple.metadata:kMDItemWhereFroms cakephp-cakephp-1.3.4-0-g703344c.zip 
$ xattr -d com.apple.quarantine cakephp-cakephp-1.3.4-0-g703344c.zip
$ ls -l@ cakephp-cakephp-1.3.4-0-g703344c.zip 
-rw-r--r--  1 kanonji  staff  1463815  9 12 20:24 cakephp-cakephp-1.3.4-0-g703344c.zip

xattrコマンドで、この様に Extended Attributes の削除が出来ました。
ちなみに、Extended Attributes が付いてるzipファイルを解凍すると、取り出した全ファイルに Extended Attributes が付きます。
xattrコマンド単独では、再帰的な処理は出来ないので、消すなら解凍する前が良いです。

xattrコマンド

$ whereis xattr
/usr/bin/xattr
$ cat /usr/bin/xattr 
#!/System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python
# EASY-INSTALL-ENTRY-SCRIPT: 'xattr==0.5','console_scripts','xattr'
__requires__ = 'xattr==0.5'
import sys
from pkg_resources import load_entry_point

sys.exit(
   load_entry_point('xattr==0.5', 'console_scripts', 'xattr')()
)

xattrはこの通り数行のPythonスクリプトです。
load_entry_point()が何かまでは、調べません。

$ xattr -h
usage: xattr [-l] file [file ...]
       xattr -p [-l] attr_name file [file ...]
       xattr -w attr_name attr_value file [file ...]
       xattr -d attr_name file [file ...]

The first form lists the names of all xattrs on the given file(s).
The second form (-p) prints the value of the xattr attr_name.
The third form (-w) sets the value of the xattr attr_name to attr_value.
The fourth form (-d) deletes the xattr attr_name.

options:
  -h: print this help
  -l: print long format (attr_name: attr_value)

xattrのUsageはこんな感じ。

$ man xattr
Cannot open the message catalog "man" for locale "ja_JP.UTF-8"
(NLSPATH="<none>")

No manual entry for xattr

マニュアルは無い様子。

AppleDouble

EAはTigerで実装されたHFS Plus独自の機構であり、ファイル本体とは別に存在するため、HFS Plus以外のファイルシステムへコピーすると原則して失われる(通常は「AppleDouble」の機能により、EAは「._元のファイル名」という形式の別ファイルに書き出されるが)。

http://journal.mycom.co.jp/column/osx/253/index.html

Macで圧縮したファイルをWindowsに持っていくと、「._元のファイル名」という容量の小さいゴミファイルが入ってます。
どうやら、AppleDoubleという機能によって、Extended Attributesの内容を書き出したもののようです。
Extended Attributes をしっかり消しておけば、Windowsにファイル持ってった時に、ゴミファイルが出ないのかな?