用tar -czf压缩、tar -xzf解压;-f必须紧接文件名且为最后一个参数,否则报错,因-f后必须直接跟归档文件名,中间不能有空格或选项。

直接用 tar -czf 就能一步完成打包+gzip压缩,不需要先 tar 再 gzip 两步走。
为什么必须加 -f 且放在最后
因为 -f 后面必须紧跟归档文件名,tar 会把之后的所有参数都当作文件名处理。如果写成 tar -fcz archive.tar.gz dir/,tar 会误以为 c 和 z 是文件名,报错 tar: Cowardly refusing to create an empty archive。
-
-f archive.tar.gz必须是选项串的最后一个,且紧挨着文件名 - 顺序错误时,
tar不会提示“参数顺序不对”,而是直接失败或静默跳过 - 常见写法:
tar -czf project.tar.gz project/,不是tar -cfz或tar -cz -f
-c、-z、-f 各自干啥
-c 表示“创建新归档”,-z 表示“调用 gzip 压缩”,-f 表示“指定输出文件”。三者缺一不可,但只有 -f 需要参数(即文件名),其余都是开关型选项。
-
-c:没有它,tar 不知道你要打包;没有它却给了源目录,会报Must specify one of -c, -r, -t, -u, -x -
-z:不加它,生成的是纯.tar文件(未压缩);加了才生成.tar.gz -
-f:不加它,tar 默认输出到标准输出(stdout),终端刷一堆二进制数据,根本没法保存
打包时多出一层目录?那是路径没选对
执行 tar -czf backup.tar.gz /home/user/project,解压后会出现 home/user/project/ 完整绝对路径——这通常不是你想要的。真正干净的做法是先 cd 进去再相对打包。
- 正确做法:
cd /home/user && tar -czf project.tar.gz project/ - 等效写法(不 cd):
tar -czf project.tar.gz -C /home/user project/,-C指定工作目录 - 错误写法:
tar -czf backup.tar.gz /home/user/project/→ 解压出来是home/...目录树,容易导致脚本路径错乱
压缩率和速度怎么选
gzip(-z)是默认选择,平衡了速度与体积;bzip2(-j)和 xz(-J)压缩率更高,但耗 CPU 多、时间长,日常传输或备份一般没必要。
- 传给同事或 CI 下载:
tar -czf app.tar.gz app/(快,兼容性好) - 长期归档、磁盘紧张:
tar -cJf archive.tar.xz data/(压缩率最高,但解压需要xz工具) - 注意:
tar -cjf生成的.tar.bz2在某些旧系统(如 CentOS 6)可能默认没装bzip2,解压时报Cannot exec bzip2: No such file or directory
最常被忽略的一点:打包前没确认当前工作目录,导致路径意外带斜杠或绝对路径,解压后结构错乱。动手前先 pwd 看一眼,比事后重打十遍都省事。


















