当我在 OS X 中 tar 某些文件时:
tar cvf foo.tar foo
._foo
它在 tarball 中生成一个额外的文件:
./._foo
foo
仅当我在非 Mac 操作系统上提取它时才会显示。但它._foo
不存在于我的文件系统中!发生了什么?我该如何摆脱它?
答案1
OS X 的 tar 使用 AppleDouble 格式来存储扩展属性和 ACL。
$ touch file1 file2 file3
$ xattr -w key value file1
$ chmod +a 'admin allow delete' file2
$ ls -le@ *
-rw-r--r--@ 1 lauri staff 0 May 25 07:09 file1
key 5
-rw-r--r--+ 1 lauri staff 0 May 25 07:09 file2
0: group:admin allow delete
-rw-r--r-- 1 lauri staff 0 May 25 07:09 file3
$ tar -cf 1.tar *
$ tar -tf 1.tar
./._file1
file1
./._file2
file2
file3
OS X 的 tar 也知道如何将 ._ 成员转换回本机格式,但在其他平台上提取档案时通常会保留 ._ 文件。您可以通过将 COPYFILE_DISABLE 设置为某个值来告诉 tar 不包含元数据:
$ COPYFILE_DISABLE=1 tar -cf 2.tar file*
$ tar -tf 2.tar
file1
file2
file3
- copyfile 函数的描述如下
man copyfile
ls -l@
显示扩展属性的键和大小,ls -le
打印 ACLxattr -l
列出扩展属性的键和值xattr -c
清除所有扩展属性(-d 不能单独使用)chmod -N
删除 ACL- 在 OS X 上创建的 Zip 文件使用 __MACOSX 文件夹来存储类似的元数据
作为扩展属性存储的信息:
- 资源分支(资源分支自 10.4 开始为扩展属性)
- Finder 中设置的自定义图标和 Icon\r 文件的图像
- PSD 文件中的元数据
- 存储在 scpt 文件中的对象、AppleScript 编辑器窗口状态、脚本的描述
- 有关别名的信息(如果删除扩展属性,别名将停止工作)
- 从互联网下载的文件的隔离状态或源 URL
- 焦点评论
- 使用 TextEdit 保存的文件的编码
- 使用 TextMate 打开的文件的插入符号位置
- 浏览笔记
答案2
从(或许更早)开始,该命令bsdtar 3.0.3 - libarchive 3.0.3
有一个新的选项,用于抑制文件的创建。bsdtar
--disable-copyfile
._
# on Mac OS X
# /usr/bin/tar -> bsdtar
ls -l /usr/bin/tar
# from man bsdtar
--disable-copyfile
Mac OS X specific. Disable the use of copyfile(3).
答案3
这些._
文件是其他答案中提到的资源分支。但是,在使用时有一种更好的方法来摆脱它们tar
:
export COPYFILE_DISABLE=true
tar cvf foo.tar foo
还有一个dot_clean
用于清理这些文件的实用程序(我认为它通常用于外部存储)。
答案4
也回答了苹果 StackExchange
接受的答案在 MacOS Monterey (V 12.4) 上不起作用。tar 是 bsdtar,手册页显示有一个单独的选项需要指定 --no-mac-metadata
$ tar -czv --no-mac-metadata -f <file_name> <filelist>
选项的顺序似乎很重要,因为以下命令没有给出预期的结果:
$ tar --no-mac-metadata -czvf <file_name> <filelist>