避免 .tar 的内容以“./”开头

避免 .tar 的内容以“./”开头

我想使用 tar 和 xz 备份目录,但有问题。当我打开文件时,所有文件和目录都以 开头./,我不希望发生这种情况。

file.tar.xz
    |---- ./directory
        |---- ./file1.txt
    |---- ./file2.txt        
    |---- ./file3.txt

这是我正在使用的代码:

tar -cf - -C $dir --absolute-names . | xz -c > $output/$name.$date.txz

我需要改变什么来避免这种情况?

答案1

如果您不介意不处理名称中包含特殊字符的下一级文件或目录$dir

tar -cf - -C "$dir" --absolute-names $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"

这会列出 的内容$dir并告诉tar您对其进行存档,而不是.,这会导致 的内容$dir出现在存档的根目录中。

由于您不是从/-rooted 路径开始,因此不需要 GNU 特定的--absolute-names

tar -cf - -C "$dir" $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"

答案2

使用pax(用于归档的 POSIX 命令):

(cd -P -- "$dir" && pax -w's|^\./||' .) | xz > file.tar.xz

但请注意,与 GNU 一样tar--transform替换s|^\./||也适用于符号链接目标,因此如果foo -> ./bar当前目录中有符号链接,它将被存档为foo -> bar.

使用 GNU 时tar,您可以通过传递标志来避免它S

tar --transform='s|^\./||S' -cf - . | xz > file.tar.xz

标准pax命令没有等效命令。

答案3

首先,从 的使用来看--absolute-names,您不介意使用 GNU Tar 选项。在这种情况下,解决方案很简单,根据以下模式:

tar -cf archive.tar --transform s/..//S .

参数--transform是一个sed模式,在将每个名称存储到存档中之前,该模式将应用于每个名称。我们删除了前两个字符:点和斜线。该S标志是为了不是对符号链接的目标进行替换。

如果您的目录不包含必须.进入存档的隐藏条目(以 开头的条目),您可以cd进入该目录,在其中可以使用以下*模式:

( cd "$dir" && tar -cf - -- * ) | xz -c > "$output/$name.$date.txz"

请注意,我们使用括号将此目录更改限制为 shell 子进程。管道的右侧元素 ,xz ...在原始目录中执行,因此如果$output是相对的,它就会按预期工作。我们使用这样的话,如果失败&&我们就不会执行。tarcd

如果有几个.名称,则可以明确列出它们,如 中所示tar ... * .important1 .important2

说到--absolute-namesGNU 特定的选项,我放弃了它,因为它的工作是保留/路径的前导(否则将被剥离),这不会在这里发生。

为了使其有意义,您必须执行以下操作:

tar -cf whole-fs.tar --absolute-names /
tar -cf etc-dir.tar --absolute-names /etc

答案4

如何使用第一个免费tar实现star,默认情况下去除多余的前导./

星星可在以下位置获得:

https://sourceforge.net/projects/s-tar/

开发快照位于:

http://schilytools.sourceforge.net/

Star 最初创建于 1982 年,多年来一直是所有 Linux 发行版的一部分。然后,由于未知的原因,大多数发行版都放弃了它,尽管它包含了 gtar 上缺失的gtar或以有缺陷的方式实现的 Linux 特定功能。据我所知,许多系统管理员获取 star 并编译它,因为它比其他 tar 实现引起的问题更少。

事实上,libfind自 2004 年以来,star 就包含在内,使得您可以做一些其他 tar 实现无法一步完成的事情,或者您根本无法做的事情。内置功能find使许多任务变得更加简单。

请注意,其他 tar 实现中的许多功能首先出现在 star 中,后来被包含在其他 tar 实现中。目前在各种 tar 实现中使用的大多数基于 POSIX.1-2001 标准的归档格式扩展都取自 star。

相关内容