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


17

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

calendar_final /._ style.css

calendar_final / style.css

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



这些不是临时文件,而是代表OS X文件系统元数据(如果我没记错的话,它们包括Finder标签,类型和创建者代码,扩展属性等)。这些文件在OS X上创建tar之前不存在。可能的答案取决于您使用的是OS X / HFS +还是其他系统。
丹尼尔·贝克

Answers:


33

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

这些._*存档条目是AppleDouble数据块,其中包含与相应文件(不带._前缀的文件)关联的额外信息。它们是由Mac OS X特定的copyfile(3)函数系列生成的。AppleDouble Blob存储访问控制数据(ACL)和扩展属性(通常是Finder标志和“资源派生”,但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 …

如果您想更多地使用这种方式,则可以在外壳的初始化文件中设置此变量。

# 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


有人看到这行不通吗?我在优胜美地上尝试了该解决方案,当我在AIX盒上解压缩时,仍然会生成PaxHeader目录
conorgriffin

5

这应该工作:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

我以为它可以用,但是实际上,当我解压缩档案时,我发现它们已经包含在内:/

很奇怪,您使用哪个版本的tar?tar --version在这里给出GNU 1.23。
Frederik Deweerdt 2011年

1
这些文件是OS X上的文件系统元数据,在运行tar之前不存在,因此可能无法通过这种方式排除。包括它们是为了在解压缩在另一台Mac上存档时恢复OS X文件元数据。
丹尼尔·贝克

为我工作。我建议使用tar vzcf ...来查看是否包含任何错误的文件。
stribika 2011年

@stribika他最有可能在OS X上。请参阅我对此问题的评论。无法排除文件,因为它们不在tar归档文件之外。
丹尼尔·贝克

2

弗雷德里克·杜威特提供了一种可在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

有趣的...我不知道pax。
gabe。

2

bsdtar 3.0.3 - libarchive 3.0.3(可能更早)开始,该bsdtar命令有一个新的(特定于Mac OS X)选项,--disable-copyfile用于禁止创建._文件。较旧的版本tar没有该--disable-copyfile选项,但是设置环境变量COPYFILE_DISABLE=1应该可以。


随着bsdtar 2.8.3 - libarchive 2.8.310.7.5--disable-copyfile未记录,但仍然可用。
Stefan Schmidt

0

按着这些次序:

  1. 查找所有._文件并使用列出它们,-ls以便您可以查看所有._文件并最终将其删除。

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. 使用创建存档.tar。

    tar -cvf name.tar /path/to/directory
    
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.