这是我参与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包等重要的包,那么解包后很可能会造成覆盖等影响,后果可想而知==。
- 所以==根本原因是因为打包时会把目录结构打进去,解包时也会把对应的目录结构解出来==,==所以如果这是个绝对路径,那么就会把原本的/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到目标目录下使用相对路径 。用相对路径打包,解包后的文件就是想要打包的文件,不会出现多余的目录结构。