在创建 .tar.gz 文件时排除目录

150

我有一个 /public_html/ 文件夹,在该文件夹中有一个 /tmp/ 文件夹,其中有大约70GB的文件是我不需要的。

现在我正在尝试创建一个 .tar.gz 文件,包括 /public_html/ 但排除 /tmp/

这是我运行的命令:

tar -pczf MyBackup.tar.gz /home/user/public_html/ --exclude "/home/user/public_html/tmp/" 

压缩包还在创建中,通过运行 ls -sh 命令我发现 MyBackup.tar.gz 已经包含了大约30GB的数据,而我确定 /public_html/ 不含有 /tmp/ 目录时文件总大小也不到1GB。我做错了什么?


“-p”选项在create函数中没有任何意义,对吧!? - Martin Schneider
10个回答

236

尝试删除目录路径末尾的最后一个 / 以排除

tar -pczf MyBackup.tar.gz /home/user/public_html/ --exclude "/home/user/public_html/tmp" 

12
排除整个文件夹及其内容:tar -pczvf MyBackup.tar.gz /home/user/public_html/ --exclude "/home/user/public_html/tmp/*" - Dr.jacky
2
无法工作,我不得不使用 --exclude="/home/user/public_html/tmp 而不是 --exclude "/home/user/public_html/tmp - Black
3
请忽略我之前无法编辑的评论:“exclude”需要像https://stackoverflow.com/users/3904223/oussaka所指出的那样首先进行指定。 至少这是为我工作的唯一方法。 - kghbln
这个答案是错误的。tar命令甚至没有"--exclude"参数。正确的应该是 "--exclude=PATTERN",其中PATTERN是要排除文件名的模式。 - Don Dilanga
-- 排除参数应该放在任何源代码之前。 - scegg
显示剩余4条评论

73

尝试将--exclude移到包含之前。

tar -pczf MyBackup.tar.gz --exclude "/home/user/public_html/tmp/" /home/user/public_html/ 

1
谢谢,这对我在一个旧的Ubuntu 14.04 LTS版本的电脑上起了作用。 - James
4
我也需要在OS X上进行这个操作。 - TheJacobTaylor
1
在去除尾部斜杠后对我有效: tar -pczf MyBackup.tar.gz --exclude "/home/user/public_html/tmp" /home/user/public_html - Dziki_Jam

28

排除目录不被压缩的正确命令是:

tar --exclude='./folder' --exclude='./upload/folder2' -zcvf backup.tar.gz backup/

确保在源和目标项之前使用 --exclude

您可以在不解压缩的情况下检查 tar.gz 文件的内容:

tar -tf backup.tar.gz

1
谢谢...这在我的Ubuntu 18.04 LTS上起作用了。 - Festus Ngor

22

是的,在ubuntu 11.04中,删除结尾的/,且所有给定的路径必须是相对路径或完整路径。在同一条命令中不能混合使用绝对路径和相对路径。

sudo tar -czvf 2011.10.24.tar.gz ./start-directory --exclude "home/user/start-directory/logs"

不会排除日志目录,但是

sudo tar -czvf 2011.10.24.tar.gz ./start-directory --exclude "./start-directory/logs"

会起作用


2
当我在排除参数中删除绝对路径时,它可以为我工作。 - jruzafa
3
这里关于混合使用绝对路径和相对路径的提示对我非常关键。 - Dmitri DB

7
您可以使用一个--exclude来排除多个内容。例如:
tar -pczf MyBackup.tar.gz --exclude={"/home/user/public_html/tmp","/home/user/public_html/data"} /home/user/public_html/

--exclude= 中的目录名称必须在 MyBackup.tar.gz/home/user/public_html/ 之间,并且不要包含 / 符号。

语法如下:

tar <OPTIONS> <TARBALL_WILL_CREATE> <ARGS> <PATH_TO_COMPRESS>

5

对我来说,被接受的答案在windows10上运行unxutils tar没有起作用。相反,我必须将要归档的文件/目录作为最后一个参数放入归档中,就像这样:

tar -pczf MyBackup.tar.gz --exclude "/home/user/public_html/tmp/" /home/user/public_html/

然后它正常工作了。

5
这对我有用:

这对我有效:

tar -zcvf target.tar.gz target/ --exclude="target/backups" --exclude="target/cache"

4

tar -pczf <目标文件.tar.gz> --exclude /排除路径 --exclude /另一个/排除路径/* /包含路径/ /另一个/包含路径/*

在Ubuntu 19.10中测试通过。

  1. exclude 关键字后面的 = 是可选的。如果你喜欢,可以使用 = 替代空格。
  2. exclude 参数必须放在源文件之前。
  3. 使用文件夹名称(如第1个示例)和使用 * (如第2个示例)之间的区别是:第2个示例会将一个空文件夹包含在打包文件中,而第1个示例不会。

3

试试这个

tar -pczvf advancedarts.tar.gz /home/user/public_html/ --exclude /home/user/public_html/tmp

-2

排除选项需要包括=符号,而"不是必需的。

--exclude=/home/user/public_html/tmp

2
如果文件夹名称中包含空格,则需要使用“ ”。 - Black

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接