FreeBSDのcpコマンドは拡張ファイル属性を一切コピーしない。FreeBSD 12.0-RELEASE-p4で確認。すなわち、現時点ではFreeBSDでcpすると拡張ファイル属性が失われる。
「-pオプションを付ければいいんじゃね?」と思ったあなた、あまーい!cpのmanにある通り、-pオプションはファイルの変更日時、アクセス日時、フラグ、パーミッション、ACL、UID、GIDしか保持しない。
ここに拡張ファイル属性付きのファイルhasxattr.txt
がある。
$ ls -al total 42 drwxr-xr-x 2 Decomo Decomo 3 10月 22 00:11 . drwxr-xr-x 56 Decomo Decomo 190 10月 21 23:43 .. -rwxr--r-- 1 Decomo Decomo 0 10月 21 23:49 hasxattr.txt $ lsextattr user * hasxattr.txt OpusMetaInformation DOSATTRIB
OpusMetaInformation
とDOSATTRIB
ってのが拡張属性の名前。
で、ファイルをcp -p
して拡張属性を表示してみると…
$ cp -p hasxattr.txt hasxattr_cp-p.txt $ lsextattr user * hasxattr.txt OpusMetaInformation DOSATTRIB hasxattr_cp-p.txt
\(^o^)/
見事にコピー先のファイル(hasxattr_cp-p.txt
)から拡張属性が消えている。
ファイラーで表示させてみても見事にコピーした方は拡張ファイル属性が消えていることが分かる。(ファイルのオレンジ色表示がOpusMetaInformation
っていう拡張ファイル属性に保存されてる。)
拡張ファイル属性好きとしては悲しい、というか困る。
sysutils/coreutils
に入ってるGNU cpならどうだと試してみるも、つれないお返事…
$ gcp --preserve=xattr hasxattr.txt hasxattr_gcp.txt gcp: 拡張属性を保護できません。cp が xattr サポートなしで作成されています
rsync -Xやmvでは拡張ファイル属性が保持される。
$ rsync -X hasxattr.txt hasxattr_rsync.txt $ mv hasxattr.txt hasxattr_mv.txt $ lsextattr user * hasxattr_cp-p.txt hasxattr_mv.txt OpusMetaInformation DOSATTRIB hasxattr_rsync.txt OpusMetaInformation DOSATTRIB
調べてたら、FreeBSD/Linux/MacOSのコマンド別に拡張ファイル属性の対応状況が書いてある素敵なぺージを発見。
Extended attributes: the good, the not so good, the bad.
それにしても、coreutilsのビルドオプションでgcpの拡張ファイル属性対応を選べるようにして欲しいなぁ…。