CLI AI

Linux 用一条命令解压 tar.gz、zip 或 7z

2026-06-15

tar -xf archive.tar.gz 不需要任何参数就能解压 tar、tar.gz、tar.bz2、tar.xz 和 tar.zst——现代 tar 会根据文件内容自动识别压缩格式。另一个能省不少麻烦的习惯是:解压别人的压缩包之前先看看里面有什么,因为没有统一顶层目录的压缩包会把文件散落到你当前的目录里。

1. 先看看里面有什么

clai
$ clai 看看这个压缩包里有什么,先不解压→ tar -tf arch.tar.gz | head -4d/d/b/d/b/two-copy.txtd/a/

-t 只列出内容,不解压。如果所有路径都在同一个顶层目录下,这个压缩包就很规范。如果列表里是 ./file1、./file2 这种没有共同目录的路径,解压会把文件散落到当前目录里。

2. 解压时不用管压缩格式

clai
$ clai 解压这个压缩包→ tar -xf arch.tar.gz

现代 GNU tar 会根据文件内容自动识别 gzip、bzip2、xz 和 zstd。z、j、J 这些参数只有旧版本的 tar 或者创建压缩包时才需要。一条命令就能覆盖所有基于 tar 的格式。

3. 解压到单独的目录

clai
$ clai 把这个压缩包解压到叫 out 的文件夹→ mkdir -p out && tar -xf arch.tar.gz -C out

-C 在解压前先切换目录。这也是应对第 1 节里「压缩包炸弹」的办法:就算里面没有共同目录,乱七八糟的文件也会落在 out 里,不会散落在你脚下。

4. 只取出一个文件

clai
$ clai 只从压缩包里取出 d/a/three.txt 这个文件→ tar -xf arch.tar.gz d/a/three.txt

路径要和 tar -tf 输出里显示的一模一样。不要猜——直接从列表里复制。

5. 其他格式

clai
$ clai 把这个 zip 解压到叫 out 的文件夹→ unzip -d out archive.zip

unzip 用 -d 指定输出目录,不是 -C。7z 则是 7z x archive.7z -oout——-o 后面不能有空格,否则会被当成文件名。每个工具都为同一件事发明了自己的参数。

6. 不解压也能搜索内容

clai
$ clai 在压缩包里搜索 error 这个词,不用解压→ tar -xzOf logs.tar.gz | grep -n 'error' | head

-O 把文件内容直接输出到标准输出,而不是写到磁盘上。对于好几个 GB 的日志压缩包来说,这就是「立刻搞定」和「先找 10 GB 空闲空间」的区别。

常见坑

  • f 这个参数必须放在组合的最后。 tar -xfz 会把 z 当成文件名来用。正确写法是 tar -xzf,或者干脆用 tar -xf。
  • .tar.gz 和 .tgz 是一回事。 .tar.bz2 和 .tbz2 也一样。扩展名说了不算,tar 看的是内容。
  • 带绝对路径的压缩包很危险。 如果 tar -tf 显示的路径以 / 开头,解压可能会覆盖系统文件。这种压缩包只能配合 -C 解压到单独的目录,而且要先看过列表再动手。

相关问题

怎么查看压缩包里文件的大小? tar -tvf archive.tar.gz——v 会附带权限、所有者、大小和日期。

为什么 unzip 会把非 ASCII 文件名弄乱? zip 里文件名的编码从来没有统一标准。对于来自 Windows、带西里尔字母名字的压缩包,unzip -O CP866 能解决问题。

怎么一次性解压多个压缩包? 先创建好目录,再执行 for f in *.tar.gz; do tar -xf "$f" -C "${f%.tar.gz}"; done。

相关阅读

不管你丢给它什么格式的压缩包,CliAI 都会写出正确的解压命令,参数也一并配好。一行命令安装。