创建 tar.gz 时忽略文件和目录
快速使用1
$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
1. 概述
在 Linux 和 类 Unix 系统中,tar 命令用于打包文件。2
它能打包成多种格式,像是 .tar, .tar.gz, .cpio, .tar.bz2, .zip, .rar 等。
打包成 .tar.gz 格式时使用的是 gzip 算法,打包成 .tar.bz2 格式时使用 bzip 算法。
这篇教程介绍了打包 .tar.gz 文件时以不同的方式排除 1 个或多个文件、目录。
2. 环境准备
使用 mkdir 命令创建名称为 parent_directory 的目录,目录中存放教程要用到的文件和目录。
mkdir parent_directory
进入到该目录。
cd parent_directory
使用 touch 命令创建 3 个文件:
touch file1.txt file2.txt file3.txt
创建 3 个目录:
mkdir folder1 folder2 folder3
执行完上面的命令,的目录结构如下:
ls
file1.txt file3.txt folder2
file2.txt folder1 folder3
3. 使用 -exclude 选项
tar -exclude 选项基础语法:
tar --exclude="pattern" [options] [archive_name] [path]
打包 .tar.gz 时使用 -exclude 选项跳过文件或目录。
tar --exclude='file1.txt' -zcvf backup.tar.gz .
./
./folder3/
./file3.txt
./folder1/
./file2.txt
./folder2/
tar: .: file changed as we read it
一起来分析一下这个命令:
- -z 使用 gzip 算法压缩文件和目录
- -c 创建新的打包文件
- -v 显示打包文件和目录的过程
- -f 给打包的文件起一个名字
- –exclude 打包时排除 file1.txt 文件
最后的 . 代表当前工作目录,里面包含了我们需要打包的文件。
排除目录时,不能用正斜线 / 结尾。
我们看到消息 "file changed as we read it",是因为 backup.tar.gz 文件和被打包的文件在同一目录中。
使用 -v 选项可以看到上面命令执行时跳过了 file1.txt 文件。
使用以下命令列出 backup.tar.gz 文件中的内容而无需解压。
tar -tf backup.tar.gz
./
./folder3/
./file3.txt
./folder1/
./file2.txt
./folder2/
-t 选项列出打包文件中的内容。
3.1 排除多个文件和目录
使用多个 –exclude 选项排除多个文件或目录。
tar --exclude='file1.txt' --exclude='folder1' -zcvf backup.tar.gz .
./
./folder3/
./file3.txt
./file2.txt
./folder2/
tar: .: file changed as we read it
也可以用下面这种方式:
tar --exclude={"file1.txt", "file2.txt"} -zcvf backup.tar.gz .
file3.txt
folder3
folder2
folder1
花括号这种方式在 Bash 方法中可能会有问题, –exclude 选项可能无法正确工作。
3.2 排除指定扩展名文件
通过匹配正则表达式可以排除指定扩展名文件:
tar --exclude='*.txt' -zcvf backup.tar.gz .
./
./folder3/
./folder1/
./folder2/
tar: .: file changed as we read it
上面的命令跳过所有扩展名是 .txt 的文件。
同样因为 backup.tar.gz 文件和被打包的文件在同一目录中,返回了 "file changed as we read it" 消息。
tar 命令内置了一些选项可以忽略一些自动生成的文件,下面是一些选项和他们的行为:
- –exclude-backups 排除所有 backup 和 lock 文件
- –exclude-cashes 排除所有有 CACHEDIR.TAG 标签的目录,不包括标签本身
- –exclude-vcs 排除所有版本控制文件
- –exclude-vcs-ignores 排除所有版本控制系统中忽略的文件,例如在 .gitignore 中列出的文件、目录以及扩展名都将被排除,包括 .gitignore 文件本身也会被排除。
4. 使用排除文件
使用 tar 命令打包或解压文件时,可以提供一个文件,文件中包含需要排除的文件、目录。这个文件叫做排除文件。
下面是打包时使用排除文件忽略指定文件。
首先,创建一个名称为 exclude_file.txt 的排除文件:
touch exclude_file.txt
接着添加需要被排除的文件或目录名,以行进行分割。
file1.txt
folder3
file2.txt
排除包含在 exclude_file.txt 文件中的项目。
tar -zcvf backup.tar.gz -X exclude_file.txt .
./
./folder1/
./folder2/
./exclude_file.txt
./file3.txt
tar: .: file changed as we read it
使用 -X 选项接收一个排除文件。它是 –exclude-from 选项的简写形式:
tar -zcvf backup.tar.gz --exclude-from="exclude_file.txt" .
排除文件中同样可以使用正则表达式。
改变一些 exclude_file.txt 文件内容:
*.txt
再次打包文件:
tar -zcfv backup.tar.gz --exclude-from="exclude_file.txt" .
./
./folder3/
./folder2/
./folder1/
可以看到上面的命令跳过了扩展名是 .txt 的文件。
5. 总结
这篇文章介绍了打包 .tar.gz 文件时排除一些指定文件或目录的方法。
打包小型目录时 –exclude 选项很实用,而打包大型目录时使用排除文件则很方便。