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-namestar czf backup.tar.gz -P /home/ubuntu/project如果创建时加了 -P那么路径会原样写进归档不再自动转成相对路径。但要注意-P 只管创建这一侧。解压时除非你在 tar xzf 后面也加了 -P否则 tar 照样去掉那个斜杠。-P 在创建和提取上是两个独立开关各管各的。所以「你怎么写它怎么存」只在创建这一步成立。收包的人拿到的仍然是一个默认安全的包除非他自己也过了 -P 这道闸。默认的「去掉」照顾的是不知情的接收方-P 留给确认风险的人。一道负责兜底一道放行知情者。下次看到 Removing leading / from member names可以这么理解tar 在提醒你——这个包会给谁对方会怎么解。想清楚了再决定是不是真的要加 -P。