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
这应该有效:
tar zcf calendar.tgz "a calendar_final" --exclude '.*'
Run Code Online (Sandbox Code Playgroud)