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

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

我想创建特定目录(当然还有它的子目录)的 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)、gnutarpax)将为._*任何具有与其关联的扩展信息的文件生成归档成员;在“取消归档”模式下,它们还将解码这些归档成员并将生成的扩展信息应用到关联的文件。通过保留并稍后提取 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

弗雷德里克·德威特给出了一个适用于 GNU tar(用于 Linux、Cygwin、FreeBSD、OSX,可能还有其他系统)的解决方案,但不适用于其他系统,如 NetBSD、OpenBSD 或 Solaris。

POSIX 没有指定tar命令(因为它在 UNIX 变体之间变化太大)并引入了pax命令代替。该选项-w表示生成存档(-r摘录),并-x选择存档格式。该选项-s '!BRE!!'排除路径与基本正则表达式 BRE 匹配的所有文件。

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

答案4

现代版本是使用--no-xattrsMacOS 的 BSD tar 标志来创建 tarball。

tar --no-xattrs -c -f <tarfilename> [file list/glob/whatever]

相关内容