我想创建一个特定目录的tar存档(当然还有它的子目录)。但是,当我使用tar命令执行此操作时,会得到包含的文件列表,例如:
calendar_final /._ style.css
calendar_final / style.css
如您所见,同一文件有两个版本。这适用于每个文件,并且有很多。如何从tar存档中排除带有._前缀的临时文件?
我想创建一个特定目录的tar存档(当然还有它的子目录)。但是,当我使用tar命令执行此操作时,会得到包含的文件列表,例如:
calendar_final /._ style.css
calendar_final / style.css
如您所见,同一文件有两个版本。这适用于每个文件,并且有很多。如何从tar存档中排除带有._前缀的临时文件?
Answers:
您在评论中发布了您正在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 …
如果您想更多地使用这种方式,则可以在外壳的初始化文件中设置此变量。
# 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
这应该工作:
tar zcf calendar.tgz "a calendar_final" --exclude '.*'
tar --version
在这里给出GNU 1.23。
tar vzcf ...
来查看是否包含任何错误的文件。
弗雷德里克·杜威特提供了一种可在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
从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.3
中10.7.5
的--disable-copyfile
未记录,但仍然可用。
按着这些次序:
查找所有._
文件并使用列出它们,-ls
以便您可以查看所有._
文件并最终将其删除。
find /path/to/directory -type f -iname "._*.*" -ls -delete
使用创建存档.tar。
tar -cvf name.tar /path/to/directory