为什么我在 OS X 上的 tarball 中会得到像 ._foo 这样的文件?

为什么我在 OS X 上的 tarball 中会得到像 ._foo 这样的文件?

当我在 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打印 ACL
  • xattr -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>

相关内容