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

Jes*_*der 78 tar macos

当我在 OS X 中 tar 某些文件时:

tar cvf foo.tar foo
Run Code Online (Sandbox Code Playgroud)

它会._foo在 tarball 中生成一个额外的文件:

./._foo
foo
Run Code Online (Sandbox Code Playgroud)

只有当我在非 Mac 操作系统上提取它时才会显示。但是._foo在我的文件系统上不存在!这是怎么回事?我怎样才能摆脱它?

Jes*_*der 85

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
Run Code Online (Sandbox Code Playgroud)

OS X 的 tar 也知道如何将 ._ 成员转换回本机格式,但 ._ 文件通常在其他平台上提取存档时保留。您可以通过将 COPYFILE_DISABLE 设置为某个值来告诉 tar 不包含元数据:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
Run Code Online (Sandbox Code Playgroud)
  • 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 编辑器窗口状态、脚本描述
  • 有关别名的信息(如果删除扩展属性,别名将停止工作)
  • 从 Internet 下载的文件的隔离状态或源 URL
  • 聚焦评论
  • 使用 TextEdit 保存的文件的编码
  • 使用 TextMate 打开的文件的插入位置
  • 略读笔记

  • 您还可以使用“env COPYFILE_DISABLE tar -cf archive.tar my_folder/”,而不是将此变量导出到整个系统。 (2认同)

小智 16

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).
Run Code Online (Sandbox Code Playgroud)

  • 使用`bsdtar 2.8.3 - `10.7.5` 的 libarchive 2.8.3`,`--disable-copyfile` 没有记录,但仍然可用。 (4认同)