我想使用 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
是相对的,它就会按预期工作。我们使用这样的话,如果失败&&
我们就不会执行。tar
cd
如果有几个.
名称,则可以明确列出它们,如 中所示tar ... * .important1 .important2
。
说到--absolute-names
GNU 特定的选项,我放弃了它,因为它的工作是保留/
路径的前导(否则将被剥离),这不会在这里发生。
为了使其有意义,您必须执行以下操作:
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。