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


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

评论

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

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

#1 楼

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

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

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


评论


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

–rubo77
13年11月21日在10:04



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

–马特·桑德斯(Matt Sanders)
13年12月28日在22:29

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

– alfredocambera
16年8月25日在15:16

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

–满载B.
17年2月2日在7:16

太好了,为什么不举个例子呢?这些命令去哪里了?在最后?开始?在两者之间?

– Toskan
18年9月5日在5:20

#2 楼

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

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

评论


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

–胭脂
2015年12月14日19:14



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

–DIMMSum
16-11-28在4:11

#3 楼

如果您想摆脱打印到STDERR的“从成员名称中删除开头的'/'”,但仍然希望像tar明智地那样保留那些开头的斜杠,那么我在此处看到了评论者timsoft的出色解决方案。 />
解决方案涉及使用-C选项将目录更改为根目录(/),然后指定要归档的文件树而没有前导斜线,因为现在只需要相对路径即可。这与普通的tar create命令具有相同的作用,但是不需要剥离:

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


评论


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

– Gajdipajti
2014年8月5日在7:12



如果您要以shell扩展表示的tar文件(例如tar c -C / home / foo / *)也无法使用,因为shell不知道更改后的根目录。但是对于其他情况仍然是一个很好的答案。

–鲍里斯(Boris)
2015年4月15日在6:27



-C /对我不起作用,期间。对于我来说,这并不能阻止stderr。

–触角
15年8月10日在7:45

@ A-B-B确保-C /之后的路径是相对的。

–zurfyx
16 Dec 31'在10:17

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

–满载B.
17 Dec 2'在7:20



#4 楼

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

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


代替:

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


评论


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

– alfredocambera
16年8月25日在15:19

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

–克里斯蒂亚(Christia)
17年1月11日,下午1:37

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

–满载B.
17年2月2日在7:19

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

– G-Man说“恢复莫妮卡”
18年5月2日在20:49

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

–凯文·基恩(Kevin Keane)
18年7月7日在18:34

#5 楼

这是我通过蛮力方法做到的:2>&1 | grep -v "Removing leading"

例如:

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


评论


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

–布赖恩
15年4月7日在15:19

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

–触角
2015年8月10日在7:58



@ A-B-B如果发生致命错误,我的tar命令可能会返回2。

–Jite
15年11月2日在15:46

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

–简单用户
16-09-10 17:13

#6 楼

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

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


#7 楼

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

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

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

cd / && tar xzf backupt.tar.gz

#8 楼

如果指定了归档文件的路径,则会引起此参考消息,您可以执行以下操作来解决此问题:

tar -zvcf /tmp/mike.tar.gz -P /tmp/mike




tar -zvcf mike.tar.gz -P /tmp/mike




tar -zvcf mike.tar.gz /tmp/mike


注意:这不是错误,仅供参考。

#9 楼

它不是功能,而是错误。如果以某种方式获取路径数据,删除绝对路径将创建不可解压缩的存档。 tar吐出错误并拒绝提取任何内容。最好先使用tardy过滤路径。

评论


欢迎来到该站点,并感谢您的贡献。 “傻瓜”到底是什么意思?提取在创建过程中前导/已删除的TAR归档文件后,遇到了哪个错误?您的评论适用于哪些TAR版本?使用GNU tar时,在提取过程中我当然没有遇到任何问题。

– AdminBee
20年8月21日在9:52