为什么在OS X的压缩包中会得到._foo之类的文件?


70

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

tar cvf foo.tar foo

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

./._foo
foo

仅当我在非Mac操作系统上将其解压缩时才会显示。但是._foo在我的文件系统上不存在!这是怎么回事?我该如何摆脱呢?


讨厌那个。当我使用7-Zip浏览档案时,看起来很难看。
纳撒尼尔

Answers:


79

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
  • 复制文件功能在 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打开的文件的插入位置
  • 略读笔记

我在MacOS X 10.5.8(Leopard)上默认具有GNU tar 1.15.1。GNU的最新版本是1.22(2009年3月)。下载并内置:当建立在MacOS X的它不会出现有“--no-xattrs”
乔纳森·莱弗勒

1
您也可以使用,而不是将此变量导出到整个系统env COPYFILE_DISABLE tar -cf archive.tar my_folder/
GeorgSchölly10年

1
@Cawas,问题在于它们出现在了tarball中,然后我在它分发了跨平台,并且在非Apple操作系统上没有任何意义。
杰西·贝德

1
杰西(Jesse)确实如此,对于其他OS /文件系统而言,它们确实没有任何意义。但是信息在那里,至少我们可以cattype可以看到里面的东西。通常是在此处手动输入的简单文本。我不会丢弃它进行备份,但是如果您想跨平台分发某些内容,尤其是如果错误地将其放置在那里,则可能会很浪费。只是说离开他们的选择是非常有效的。
cregox 2011年

1
仅供参考,豹子的出口线也适用于Lion。
jjeaton 2012年

12

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
随着bsdtar 2.8.3 - libarchive 2.8.310.7.5--disable-copyfile未记录,但仍然可用。
Stefan Schmidt


1

._其他答案中所述,这些文件是资源分支。但是,使用时有更好的方法摆脱它们tar

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

还有一个dot_clean用于清理这些文件的实用程序(我认为它通常用于外部存储)。


谢谢!有关解决方案,请参见上述答案的结尾。
杰西·贝德

dot_clean不适用于此功能,因为tar正在创建文件
joedevon 2010年

0

这是用于删除这些文件的python脚本。应该可以在任何流行的OS中使用。

未经彻底测试,使用风险自负!

import os
import os.path

def dot_clean(folder):
    files = os.listdir(folder)
    for file in files:
        full_name = folder + "/" + file
        if os.path.isdir(full_name):
            dot_clean(full_name)
        elif file.startswith("._"):
            os.remove(full_name)

dot_clean('.')            

1
好吧,除了带有HFS +的OS X ...
丹尼尔·贝克

为什么不?你能建议如何解决?
艾瓦尔(Aivar)

1
这些文件实际上在HFS +上并不存在,因为文件系统可以在内部存储元数据。这些文件是不支持该文件系统的变通方法,例如,当您将文件从HFS +传输到FAT USB拇指驱动器时,它们就存在了,而当您将它们传输回时,它们就消失了。
丹尼尔·贝克

-3

在Mac平台上,句点字符“。”用作隐藏文件指示符。在Windows上,它是“ $”字符。无论如何,._ foo文件可能包含某些OS X特定的信息,建议不要删除它。在其他系统上,您将不得不忽略它,否则此处的某人可能会为您提供一个脚本,该脚本将隐藏以“。”开头的文件和文件夹。


它是所有元数据,主要是自定义图标,创建文件的应用程序等内容。可以安全删除。
dreamlax

不过,如果您主要使用Mac,我建议您保留使用它。如果您使用Windows而不是OS X,请继续并杀死它。
dbmikus

(@dreamlax)确实,扩展属性中存储的许多数据都是可以安全删除的元数据,但并非总是如此。尤其是,当带有“资源派生”的文件存储在不是HFS派生的内容(FAT,UFS,tar等)上时,这些“ ._ *”文件用于保存(除其他扩展属性外)资源叉。尽管许多文件格式不再使用资源派生(转向捆绑),但有些文件中关键数据存储在资源派生中(有时资源数据是唯一的数据)。
克里斯·约翰森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.