创建目录的 tar 存档,隐藏文件除外?

17 tar

我想创建一个特定目录的 tar 存档(当然还有它的子目录)。但是当我这样做时,使用 tar 命令,我得到了一个包含的文件列表,例如:

一个 calendar_final/._style.css

一个 calendar_final/style.css

如您所见,同一个文件有两个版本。这适用于每个文件,而且有很多。如何从 tar 存档中排除带有 ._ 前缀的临时文件?

Chr*_*sen 35

您在评论中发布说您正在 Mac OS X 系统上工作。这是了解这些._*文件用途的重要线索。

这些._*存档条目是AppleDouble数据块,其中包含与相应文件(没有._前缀的文件)相关联的额外信息。它们由 Mac OS X 特定的copyfile(3)系列函数生成。AppleDouble blob 存储访问控制数据 (ACL) 和扩展属性(通常,Finder标志和“资源分支”,但 xattrs 可用于存储任何类型的数据)。

系统提供的 Mac OS X 存档工具(bsdtar(也符号链接为tar)、gnutar、 和pax)将为._*任何具有相关扩展信息的文件生成存档成员;在“取消归档”模式下,他们还将解码这些归档成员并将生成的扩展信息应用于相关文件。这通过保留并随后提取 HFS+ 文件系统可以存储的所有信息来创建用于 Mac OS X 系统的“完全保真”存档。

其他系统上相应的归档工具不知道对这些._*文件进行特殊处理,因此将它们作为普通文件进行解压。由于此类文件在其他系统上相当无用,因此它们通常被视为“垃圾文件”。相应地,如果非 Mac OS X 系统生成包含以 开头的普通文件的存档,._Mac OS X 解存档工具将尝试将这些文件解码为扩展信息。

然而,有一种未公开的(?)方法可以使系统提供的 Mac OS X 归档程序的行为与它们在其他 Unixy 系统上的行为一样:COPYFILE_DISABLE 环境变量。设置此变量(设置为任何值,甚至是空字符串)将阻止归档程序生成._*归档成员来表示与归档文件关联的任何扩展信息。它的存在也将阻止档案员试图将这些档案成员解释为扩展信息。

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …
Run Code Online (Sandbox Code Playgroud)

如果您想经常以这种方式工作,您可以在 shell 的初始化文件中设置此变量。

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE
Run Code Online (Sandbox Code Playgroud)

然后,当您需要重新启用该功能(以保留/恢复扩展信息)时,您可以“取消设置”单个命令的变量:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)
Run Code Online (Sandbox Code Playgroud)

Mac OS X 10.4 上的存档器也做类似的事情,但它们使用不同的环境变量:COPY_EXTENDED_ATTRIBUTES_DISABLE


Fre*_*rdt 5

这应该有效:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'
Run Code Online (Sandbox Code Playgroud)

  • 这些文件是 OS X 上的文件系统元数据,在运行 tar 之前不存在,因此可能无法通过这种方式排除。包含它们是为了在解压在另一台 Mac 上存档时恢复 OS X 文件元数据。 (2认同)