我想创建特定目录(当然还有它的子目录)的 tar 存档。但是当我使用 tar 命令执行此操作时,我会得到包含的文件列表,例如:
calendar_final/._style.css
calendar_final/style.css
正如您所看到的,同一文件有两个版本。这适用于每个文件,而且有很多。如何从 tar 存档中排除带有 ._ 前缀的临时文件?
答案1
您在评论中表示您正在 Mac OS X 系统上工作。这是了解这些文件用途的重要线索._*
。
这些._*
归档条目是大块的苹果双打包含与相应文件(没有前缀的文件._
)关联的额外信息的数据。它们是由 Mac OS X 特定的复制文件(3)函数族。 AppleDouble blob 存储访问控制数据 (ACL) 和扩展属性(通常,发现者标志和“资源分叉”,但 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 …
如果您想经常以这种方式工作,您可以在 shell 的初始化文件中设置此变量。
# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE
然后,当您需要重新启用该功能(以保留/恢复扩展信息)时,您可以“取消设置”各个命令的变量:
(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)
Mac OS X 10.4 上的归档程序也执行类似的操作,尽管它们使用不同的环境变量:COPY_EXTENDED_ATTRIBUTES_DISABLE
答案2
这应该有效:
tar zcf calendar.tgz "a calendar_final" --exclude '.*'
答案3
答案4
现代版本是使用--no-xattrs
MacOS 的 BSD tar 标志来创建 tarball。
tar --no-xattrs -c -f <tarfilename> [file list/glob/whatever]