tar 打包压缩与解压命令详解

前言

在服务器、WSL 或 Linux 环境中,经常需要把一个项目目录打包成压缩包,方便备份、迁移或传输。

例如我们有一个 LocAgent 项目,里面既有源码,也可能有测试文件、缓存文件、大型数据集仓库等内容。如果直接全部打包,压缩包可能会非常大,而且会包含很多没必要迁移的缓存目录。

这时就可以使用 tar 命令配合 --exclude 参数,在打包时排除不需要的目录。

本文主要讲解下面两类命令:

1
2
3
4
5
6
7
tar \
--exclude="LocAgent/playground" \
--exclude="LocAgent/repo_swebenchlite" \
--exclude="LocAgent/repo_locbench" \
--exclude="LocAgent/**/__pycache__" \
--exclude="LocAgent/.pytest_cache" \
-czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent

以及:

1
tar -xzf LocAgent.tar.gz

前者用于打包压缩,后者用于解压。

一、tar 命令整体理解

1.1 tar 是什么

tar 是 Linux 中常用的打包工具。

它可以把多个文件或文件夹打成一个包。

例如原本项目结构是:

1
2
3
4
5
LocAgent/
README.md
src/
tests/
configs/

使用 tar 打包后,可以变成:

1
LocAgent.tar

不过 .tar 只是打包,不一定压缩。

如果再配合 gzip 压缩,就会得到:

1
LocAgent.tar.gz

也可以写成:

1
LocAgent.tgz

可以简单理解为:

1
2
3
tar:负责把很多文件装进一个大箱子
gzip:负责把这个大箱子压缩变小
tar.gz:打包 + 压缩之后的结果

1.2 为什么命令写成多行

命令中的反斜杠:

1
\

表示当前命令还没有结束,下一行继续接着写。

所以:

1
2
3
tar \
--exclude="LocAgent/playground" \
-czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent

等价于:

1
tar --exclude="LocAgent/playground" -czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent

写成多行只是为了让命令更清晰,尤其是排除目录比较多的时候。

二、打包压缩命令详解

2.1 完整命令

完整打包命令如下:

1
2
3
4
5
6
7
tar \
--exclude="LocAgent/playground" \
--exclude="LocAgent/repo_swebenchlite" \
--exclude="LocAgent/repo_locbench" \
--exclude="LocAgent/**/__pycache__" \
--exclude="LocAgent/.pytest_cache" \
-czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent

整体意思是:

  1. 把 LocAgent 文件夹打包压缩
  2. 排除 playground、repo_swebenchlite、repo_locbench 等目录
  3. 排除 Python 缓存和 pytest 缓存
  4. 生成 LocAgent_with_tests.tar.gz
  5. 保存到 /mnt/d/ 目录下

如果是在 WSL 中执行,/mnt/d/ 通常对应 Windows 的 D 盘:

1
/mnt/d/LocAgent_with_tests.tar.gz

也就是 Windows 中的:

1
D:\LocAgent_with_tests.tar.gz

2.2 -czf 参数含义

命令中的核心参数是:

1
-czf

它其实是三个参数的组合:

1
2
3
-c:create,创建一个新的 tar 包
-z:gzip,使用 gzip 压缩
-f:file,指定输出文件名

所以这一段:

1
-czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent

可以拆成:

1
2
3
4
5
-c:创建压缩包
-z:使用 gzip 压缩
-f:指定压缩包文件名
/mnt/d/LocAgent_with_tests.tar.gz:输出位置和文件名
LocAgent:要打包的目录

需要注意的是,-f 后面必须紧跟压缩包路径。

也就是说:

1
tar -czf 压缩包路径 要打包的目录

例如:

1
tar -czf backup.tar.gz LocAgent

表示把 LocAgent 目录打包成 backup.tar.gz

2.3 –exclude 参数含义

--exclude 用于在打包时排除指定文件或目录。

例如:

1
--exclude="LocAgent/playground"

表示:

1
打包 LocAgent 时,不要把 LocAgent/playground 放进去

你这条命令中排除了这些内容:

1
--exclude="LocAgent/playground"

表示排除实验运行目录或临时目录。

1
--exclude="LocAgent/repo_swebenchlite"

表示排除 SWE-bench Lite 相关仓库目录。这个目录通常会比较大,不适合一起打包。

1
--exclude="LocAgent/repo_locbench"

表示排除 LocBench 相关仓库目录。

1
--exclude="LocAgent/**/__pycache__"

表示排除所有 Python 缓存目录。

例如:

1
2
3
LocAgent/src/__pycache__
LocAgent/tests/__pycache__
LocAgent/tools/utils/__pycache__

__pycache__ 是 Python 运行后自动生成的缓存目录,不属于核心源码,通常不需要打包。

1
--exclude="LocAgent/.pytest_cache"

表示排除 pytest 测试框架生成的缓存目录。

这些缓存目录删除后不会影响源码本身,之后重新运行程序或测试时会自动生成。

2.4 为什么要排除这些目录

一个项目目录里通常有几类内容:

  1. 源码文件:需要保留
  2. 配置文件:需要保留
  3. 测试代码:根据需要保留
  4. 数据集仓库:通常很大,可以排除
  5. 运行缓存:没必要保留
  6. 临时输出:根据情况排除

如果不加 --excludetar 会把整个 LocAgent 目录全部打包进去。

这样可能会导致:

  1. 压缩包很大
  2. 打包速度变慢
  3. 传输时间变长
  4. 包含大量无用缓存
  5. 迁移后目录不够干净

所以使用 --exclude 的目的就是:只打包真正有价值的项目文件,排除大目录、缓存目录和临时目录。


三、解压命令详解

3.1 基本解压命令

解压 .tar.gz 文件可以使用:

1
tar -xzf LocAgent.tar.gz

其中:

1
2
3
-x:extract,解压
-z:gzip,表示解压 gzip 压缩包
-f:file,指定要解压的文件

所以:

1
tar -xzf LocAgent.tar.gz

意思是:把 LocAgent.tar.gz 解压到当前目录

3.2 注意压缩包文件名要一致

前面打包生成的文件名是:/mnt/d/LocAgent_with_tests.tar.gz

但是解压命令里写的是:tar -xzf LocAgent.tar.gz

这两个文件名并不一致。

3.3 解压到指定目录

默认情况下,tar -xzf 会把文件解压到当前目录。

如果想指定解压位置,可以使用 -C 参数。

例如:

1
tar -xzf /mnt/d/LocAgent_with_tests.tar.gz -C /home/user/

表示:

1
把 /mnt/d/LocAgent_with_tests.tar.gz 解压到 /home/user/ 目录下

解压后结果通常是:

1
/home/user/LocAgent/

需要注意的是,-C 后面的目录必须已经存在。

如果目录不存在,需要先创建:

1
mkdir -p /home/user/

然后再解压。


四、常用命令整理

4.1 打包 LocAgent 项目并排除无用目录

1
2
3
4
5
6
7
tar \
--exclude="LocAgent/playground" \
--exclude="LocAgent/repo_swebenchlite" \
--exclude="LocAgent/repo_locbench" \
--exclude="LocAgent/**/__pycache__" \
--exclude="LocAgent/.pytest_cache" \
-czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent

4.2 查看压缩包是否生成

1
ls -lh /mnt/d/LocAgent_with_tests.tar.gz

其中:

1
2
-l:以详细信息形式显示
-h:以更友好的单位显示文件大小,例如 KB、MB、GB

如果看到类似结果:

1
-rwxrwxrwx 1 user user 120M Jun 6 15:30 /mnt/d/LocAgent_with_tests.tar.gz

说明压缩包已经成功生成。

4.3 解压到当前目录

1
tar -xzf /mnt/d/LocAgent_with_tests.tar.gz

作用:

1
把 LocAgent_with_tests.tar.gz 解压到当前目录

4.4 解压到指定目录

1
tar -xzf /mnt/d/LocAgent_with_tests.tar.gz -C /home/user/

作用:

1
把压缩包解压到 /home/user/ 目录下

4.5 查看压缩包内容但不解压

有时候我们只是想看看压缩包里面有什么,不想直接解压,可以使用:

1
tar -tzf /mnt/d/LocAgent_with_tests.tar.gz

其中:

1
2
3
-t:list,列出压缩包内容
-z:gzip
-f:指定文件

如果想分页查看,可以配合 less

1
tar -tzf /mnt/d/LocAgent_with_tests.tar.gz | less

总结

本文主要讲解了 tar 打包压缩和解压命令。

核心命令是:

1
tar -czf 压缩包路径 要打包的目录

表示创建一个 .tar.gz 压缩包。

如果想排除某些目录,可以使用:

1
--exclude="要排除的路径"

例如:

1
2
3
4
5
6
7
tar \
--exclude="LocAgent/playground" \
--exclude="LocAgent/repo_swebenchlite" \
--exclude="LocAgent/repo_locbench" \
--exclude="LocAgent/**/__pycache__" \
--exclude="LocAgent/.pytest_cache" \
-czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent

表示把 LocAgent 目录打包压缩,同时排除大型数据目录和缓存目录。

解压命令是:

1
tar -xzf 压缩包路径

例如:

1
tar -xzf /mnt/d/LocAgent_with_tests.tar.gz

如果想解压到指定目录,可以使用:

1
tar -xzf /mnt/d/LocAgent_with_tests.tar.gz -C /home/user/

简单来说:

1
2
3
4
5
-czf:创建压缩包
-xzf:解压压缩包
-tzf:查看压缩包内容
--exclude:打包时排除指定文件或目录
-C:解压到指定目录

掌握这些命令后,在服务器、WSLLinux 环境中迁移项目会方便很多。