tar路径问题 -- tar: 从成员名中删除开头的“/”

1,462 阅读3分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

  • tar在打包时,如果==打包目标是绝对路径时==会出现警告tar: 从成员名中删除开头的“/”==根本原因是因为打包时会把目录结构打进去,解包时也会把对应的目录结构解出来==

演示

  • 目录结构:/data/dir/a.txt,打包dir目录

相对路径

通常建议相对路径打包,会先cd到目标所在目录data

  • 打包 在这里插入图片描述 在这里插入图片描述
  • 归档管理器打开tar包是这样的。0字节是因为a.txt里边没东西,都是空的 在这里插入图片描述
  • 删除dir,然后解包。这是正常,也是我们想要的样子 在这里插入图片描述

绝对路径

tar在打包时,如果==打包目标是绝对路径==,会警告tar: 从成员名中删除开头的“/”

  • 打包,目标是绝对路径,警告tar: 从成员名中删除开头的“/” 在这里插入图片描述
  • 归档管理器打开tar包是这样的。(0字节是因为a.txt里没数据,空内容) 在这里插入图片描述
  • 删除dir,解包,可以看到,是以data开始的。所以刚才的警告:“从成员名中删除开头的“/””,意思是把打包目标的目录结构从/data/dir变成data/dir,这样我们无论在哪个路径下解压,解压出的文件目录结构都是相对于当前路径的。
    • 所以==根本原因是因为打包时会把目录结构打进去,解包时也会把对应的目录结构解出来==,==所以如果这是个绝对路径,那么就会把原本的/data下的东西覆盖掉,如果我们是打的home包或者root包等重要的包,那么解包后很可能会造成覆盖等影响,后果可想而知==。 在这里插入图片描述

一意孤行(强行操作)会怎样

那么我们就测试一下,会不会覆盖。tar指令有-P选项,作用是不去掉开头的 /

  • tar指令man文档 在这里插入图片描述- 为了测试的更全面,新增了/data/dir/b.txt,并且写入hello 在这里插入图片描述
  • 打包dir,带上-P (有些选项写法是有顺序的,这里-P写在前边) 在这里插入图片描述
  • 归档管理器打开tar包是这样的 在这里插入图片描述
  • 在a.txt写入"哈哈",删除b.txt 在这里插入图片描述
  • 解压tar。(同样需要带-P,否则还是会自动去掉/变为相对路径的目录结构) 在这里插入图片描述
  • 可以看到,文件被覆盖了(b.txt解包回来了,a.txt内容被覆盖了)。

结论

  • 可以看到,用绝对路径打包时,不加-P选项,其实也不会造成(解压时覆盖等)安全问题,因为系统自动帮我们去掉了开头的"/",将绝对路径变成了相对路径,但是包结构会冗余很多,包含了上层目录。
  • 所以,平时用tar指令打包时,最好是先cd到目标目录下使用相对路径 。用相对路径打包,解包后的文件就是想要打包的文件,不会出现多余的目录结构。