tar为什么要把“/”去掉
敲完 tar czf backup.tar.gz /home/ubuntu/project,回车,等打包。结果屏幕上冒出一排:
tar: Removing leading '/' from member names
你有没有过那么一瞬间的困惑——
"你在干嘛,把斜杠去掉是几个意思,我自己打的包难道还不会解"?
其实这不是 tar 在自作主张,而是在替你兜底——因为你不知道这个包将来会在谁的手上解。
如果归档保留了前导斜杠,存的就是 /home/ubuntu/project。对方 tar xzf 一解,文件直接写回 /home/ubuntu/project。如果你的用户名和他不一样,或者项目目录另有他用,那么这包一解,轻则散一地,重则盖掉他正在用的东西。
举个更极端的例子:tar czf root.tar.gz /etc。如果路径没去掉,解压时 /etc/passwd、/etc/shadow 会尝试直接覆盖当前系统的同名文件——后果不用多说。
所以 tar 设了两道防线:
创建时,默认去掉前导斜杠, /home/ubuntu/project存成home/ubuntu/project。解压时,即使归档里存的是绝对路径, tar xzf依然默认去掉前导斜杠。
第一道防的是手滑,第二道防的是接盘。
如果你真的需要保留绝对路径,tar 给了 -P(--absolute-names):
tar czf backup.tar.gz -P /home/ubuntu/project
如果创建时加了 -P,那么路径会原样写进归档,不再自动转成相对路径。
但要注意:-P 只管创建这一侧。解压时,除非你在 tar xzf 后面也加了 -P,否则 tar 照样去掉那个斜杠。-P 在创建和提取上是两个独立开关,各管各的。
所以「你怎么写它怎么存」只在创建这一步成立。收包的人拿到的仍然是一个默认安全的包,除非他自己也过了 -P 这道闸。
默认的「去掉」照顾的是不知情的接收方,-P 留给确认风险的人。一道负责兜底,一道放行知情者。
下次看到 Removing leading '/' from member names,可以这么理解:
tar 在提醒你——这个包会给谁,对方会怎么解。想清楚了再决定是不是真的要加 -P。
