tar 打包压缩与解压命令详解
tar 打包压缩与解压命令详解
前言
在服务器、WSL 或 Linux 环境中,经常需要把一个项目目录打包成压缩包,方便备份、迁移或传输。
例如我们有一个 LocAgent 项目,里面既有源码,也可能有测试文件、缓存文件、大型数据集仓库等内容。如果直接全部打包,压缩包可能会非常大,而且会包含很多没必要迁移的缓存目录。
这时就可以使用 tar 命令配合 --exclude 参数,在打包时排除不需要的目录。
本文主要讲解下面两类命令:
1 | tar \ |
以及:
1 | tar -xzf LocAgent.tar.gz |
前者用于打包压缩,后者用于解压。
一、tar 命令整体理解
1.1 tar 是什么
tar 是 Linux 中常用的打包工具。
它可以把多个文件或文件夹打成一个包。
例如原本项目结构是:
1 | LocAgent/ |
使用 tar 打包后,可以变成:
1 | LocAgent.tar |
不过 .tar 只是打包,不一定压缩。
如果再配合 gzip 压缩,就会得到:
1 | LocAgent.tar.gz |
也可以写成:
1 | LocAgent.tgz |
可以简单理解为:
1 | tar:负责把很多文件装进一个大箱子 |
1.2 为什么命令写成多行
命令中的反斜杠:
1 | \ |
表示当前命令还没有结束,下一行继续接着写。
所以:
1 | tar \ |
等价于:
1 | tar --exclude="LocAgent/playground" -czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent |
写成多行只是为了让命令更清晰,尤其是排除目录比较多的时候。
二、打包压缩命令详解
2.1 完整命令
完整打包命令如下:
1 | tar \ |
整体意思是:
- 把 LocAgent 文件夹打包压缩
- 排除 playground、repo_swebenchlite、repo_locbench 等目录
- 排除 Python 缓存和 pytest 缓存
- 生成 LocAgent_with_tests.tar.gz
- 保存到 /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 | -c:create,创建一个新的 tar 包 |
所以这一段:
1 | -czf /mnt/d/LocAgent_with_tests.tar.gz LocAgent |
可以拆成:
1 | -c:创建压缩包 |
需要注意的是,-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 | LocAgent/src/__pycache__ |
__pycache__ 是 Python 运行后自动生成的缓存目录,不属于核心源码,通常不需要打包。
1 | --exclude="LocAgent/.pytest_cache" |
表示排除 pytest 测试框架生成的缓存目录。
这些缓存目录删除后不会影响源码本身,之后重新运行程序或测试时会自动生成。
2.4 为什么要排除这些目录
一个项目目录里通常有几类内容:
- 源码文件:需要保留
- 配置文件:需要保留
- 测试代码:根据需要保留
- 数据集仓库:通常很大,可以排除
- 运行缓存:没必要保留
- 临时输出:根据情况排除
如果不加 --exclude,tar 会把整个 LocAgent 目录全部打包进去。
这样可能会导致:
- 压缩包很大
- 打包速度变慢
- 传输时间变长
- 包含大量无用缓存
- 迁移后目录不够干净
所以使用 --exclude 的目的就是:只打包真正有价值的项目文件,排除大目录、缓存目录和临时目录。
三、解压命令详解
3.1 基本解压命令
解压 .tar.gz 文件可以使用:
1 | tar -xzf LocAgent.tar.gz |
其中:
1 | -x:extract,解压 |
所以:
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 | tar \ |
4.2 查看压缩包是否生成
1 | ls -lh /mnt/d/LocAgent_with_tests.tar.gz |
其中:
1 | -l:以详细信息形式显示 |
如果看到类似结果:
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 | -t:list,列出压缩包内容 |
如果想分页查看,可以配合 less:
1 | tar -tzf /mnt/d/LocAgent_with_tests.tar.gz | less |
总结
本文主要讲解了 tar 打包压缩和解压命令。
核心命令是:
1 | tar -czf 压缩包路径 要打包的目录 |
表示创建一个 .tar.gz 压缩包。
如果想排除某些目录,可以使用:
1 | --exclude="要排除的路径" |
例如:
1 | tar \ |
表示把 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 | -czf:创建压缩包 |
掌握这些命令后,在服务器、WSL 和 Linux 环境中迁移项目会方便很多。