tar:从成员名称中删除前导“ /”


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

如何解决此问题并保留/文件名?


2
究竟是什么无法正常工作?

34
这不成问题。您不希望 tar归档文件中的前导斜杠。说真的 如果要将档案解压缩到系统根目录,请-C /在解压缩时指定。
ThiefMaster 2012年

Answers:


69

使用--absolute-names-P选项禁用此功能。

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
这是正确的答案,但请注意,在大多数情况下,这不是您想要的,因为它会导致归档文件提取出完整的路径!
rubo77

8
-C /如果这是您的主要目标,则使用@Marcus答案中所述的选项将摆脱STDERR消息。
马特·桑德斯

1
正如@ rubo77所评论的那样,通常这不是命令的预期结果。
alfredocambera

3
在大多数情况下,这不是用户想要的,这仅仅是因为他们中的大多数人直到需要时才阅读本手册(不是没有人有时间这样做)。因此,至少应该扩展您的答案,警告人们不要这样做,除非他们绝对确定他们了解它的作用,否则这是明智的。特别是被接受为答案。
Mladen B.

1
@Toskan添加示例
Barmar

89

这实际上是一个功能,不是问题。具有绝对位置的存档会带来安全风险。攻击者可以使用此类存档来诱骗用户在关键系统位置中安装文件。

是的,您可以使用-P。但是,允许tar删除正斜杠,而仅要求归档用户明确地在根目录中进行提取,这有什么问题呢?然后,它们有意识地影响关键系统的位置,而不会偶然发生。


5
有时功能是问题。设置备份脚本后,我发现了这个线程,该脚本将以电子邮件发送非零退出状态tar。该特定消息导致tar退出,状态为1,这导致我在成功备份时收到错误的电子邮件警报,原因仅在于tar将此消息写入STDERR。我使用cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
@Marcus

1
我认为有一些使用案例-P-例如,如果您在FUSE中提供某种文件系统快照功能。有时您可能想将快照解压缩到特定目录中,而不是cwd从用户的角度解压缩快照。
DIMMSum

81

如果您想摆脱打印到STDERR的“从成员名称中删除开头的'/',但仍希望像tar明智地那样保留那些开头的斜杠,那么我评论员timsoft 那里看到了一个绝佳的解决方案。

解决方案涉及到使用-C选项将目录更改为根目录(/),然后指定要归档的文件树而没有前导斜线,因为现在只需要一个相对路径即可。这与普通的tar create命令具有相同的作用,但是不需要剥离:

tar fcz bkup.tar.gz -C / home/foo/

它不适用于增量备份。但是一个很好的答案。
gajdipajti 2014年

如果您想对由shell扩展(例如tar c -C / home/foo/*)表示的文件进行tar处理,那么它也不起作用,因为shell不知道更改的根目录。但是对于其他情况仍然是一个很好的答案。
鲍里斯(Boris)2015年

1
-C /不适合我,期间。对于我来说,这并不能阻止stderr。
Acumenus

3
@ABB确保-C /之后的路径是相对的。
zurfyx

如果用户对根目录没有权限,这种方法行得通吗?
Mladen B.

31

延迟了一个月,但是我发现针对我的情况(在shell脚本中)最合适的解决方案是转到父目录并在该目录中执行命令。

cd /var/www/
tar -czf mysite.gz mysite

代替:

tar -czf /var/www/mysite.gz /var/www/mysite

9
确实,您可以使用以下命令完成此操作:tar -zcvf mysite.gz -C / var / www / mysite /这样的好处是您可以从任何目录执行它
alfredocambera

谢谢您的帮助。这就是我所需要的。我不需要压缩包中的完整路径,而只需要目标文件夹。
Christia

我认为这可能应该被接受为正确答案。
Mladen B.

我完全看不出如何回答这个问题。这是可以做的不同的事情。…………像:问:我如何从洛杉矶到纽约?A:去旧金山吧。
G人

我同意@ G-Man。这将导致tar文件具有完全不同的目录结构。在某些情况下,该目录结构实际上首先更合适,但不能回答问题。
凯文·基恩

7

这是我做到了用强制的方法:2>&1 | grep -v "Removing leading"

例如:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

4
问题在于它隐藏了错误代码。因此,如果您想在bash脚本中检查tar中的错误代码,则成功后不会返回0。
布赖恩

@staticx,无论错误代码为0。
Acumenus

1
@ABB我的tar命令可能会2在发生致命错误时返回。
Jite 2015年

1
@Brian可以使用$ PIPESTATUS获取退出代码。参见unix.stackexchange.com/questions/14270/…–
simpleuser

3

尝试-C仅用于路径,这会阻止使用完整路径进行压缩:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

我用以下方法解决了这个问题:

cd /home/foo && tar czf ~/backup.tar.gz .

这样,您就不会首先尝试将绝对路径放入tar存档中。如果您想将其解压缩到文件系统的根目录,则只需

cd / && tar xzf backupt.tar.gz 转移后。

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.