tar -xf archive.tar.gz 不需要任何参数就能解压 tar、tar.gz、tar.bz2、tar.xz 和 tar.zst——现代 tar 会根据文件内容自动识别压缩格式。另一个能省不少麻烦的习惯是:解压别人的压缩包之前先看看里面有什么,因为没有统一顶层目录的压缩包会把文件散落到你当前的目录里。
1. 先看看里面有什么
$ clai 看看这个压缩包里有什么,先不解压→ tar -tf arch.tar.gz | head -4d/d/b/d/b/two-copy.txtd/a/
-t 只列出内容,不解压。如果所有路径都在同一个顶层目录下,这个压缩包就很规范。如果列表里是 ./file1、./file2 这种没有共同目录的路径,解压会把文件散落到当前目录里。
2. 解压时不用管压缩格式
$ clai 解压这个压缩包→ tar -xf arch.tar.gz
现代 GNU tar 会根据文件内容自动识别 gzip、bzip2、xz 和 zstd。z、j、J 这些参数只有旧版本的 tar 或者创建压缩包时才需要。一条命令就能覆盖所有基于 tar 的格式。
3. 解压到单独的目录
$ clai 把这个压缩包解压到叫 out 的文件夹→ mkdir -p out && tar -xf arch.tar.gz -C out
-C 在解压前先切换目录。这也是应对第 1 节里「压缩包炸弹」的办法:就算里面没有共同目录,乱七八糟的文件也会落在 out 里,不会散落在你脚下。
4. 只取出一个文件
$ clai 只从压缩包里取出 d/a/three.txt 这个文件→ tar -xf arch.tar.gz d/a/three.txt
路径要和 tar -tf 输出里显示的一模一样。不要猜——直接从列表里复制。
5. 其他格式
$ clai 把这个 zip 解压到叫 out 的文件夹→ unzip -d out archive.zip
unzip 用 -d 指定输出目录,不是 -C。7z 则是 7z x archive.7z -oout——-o 后面不能有空格,否则会被当成文件名。每个工具都为同一件事发明了自己的参数。
6. 不解压也能搜索内容
$ 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 都会写出正确的解压命令,参数也一并配好。一行命令安装。