如何在使用tar压缩目录时排除大文件

5

我想在Linux中压缩一个目录。我创建了一个tar.gz文件,由于该目录包含一些*.o文件和一些pdf文件,因此它变成了一个大文件。

有没有办法压缩一个目录但排除大于预定义大小的文件? tar命令中有一个--exclude参数,但我想拒绝大于1 MB的文件。这是限制条件,而不是文件名。

4个回答

4

根据Jan-Philip Gehrcke的回复:

find . -type f -size -1024k -print0 | tar -czf --null -T - -f archive.tar.gz

对于小于1M的文件。在OS X和Ubuntu Linux上进行过测试。

2
在Debian Squeeze上,我遇到了这个错误:
tar: Multiple archive files require '-M' option 但是使用以下命令可以解决:
find . -type f -size -100k | tar -cz -f test.tgz -T -
- Fluxine
1
@Fluxine 我也无法让它工作。不得不查看https://dev59.com/X2025IYBdhLWcg3wpHh-,最终使用了`find . -type f -size 1M -print0 | tar -vzcf backup.tar.gz --null -T -` - Bruce van der Kooij
...| tar c --null -T - 这个方法可以在任意长的文件列表上很好地工作,但有一个小缺点:它会将整个文件列表存储在内存中。如果你有很多小文件,那可能会成为一个问题。 - P.Péter
我在Ubuntu上得到了一长串文件的打印输出,例如./file1\n./file1./file3\n以及一个错误消息无法查看状态: 文件名太长tar: 由于先前的错误而退出失败状态 - Dima Lituiev
可以通过包含“-print0”来修复它,如此讨论所述。 - Dima Lituiev

1
上面的...| tar c --null -T -解决方案是最好的,如果您有足够的内存(即文件列表很容易适合您的内存(在大多数情况下,这是正确的))。但是,如果您受到内存限制,xargs确实有用处,但必须适当使用,以使多个tar调用没有不良影响。
要压缩,可以使用:
find . -type f -size -1024k | xargs tar c | gzip > archive.tar.gz

这将生成一个连接在一起的tar归档文件,最终被gzip压缩在一起(您也可以使用cz并省略| gzip,因为连接gzip归档仍然是有效的gzip,但您会失去一点压缩,如果使用bzip2或xz而不是gzip,则会失去相当多的压缩)。
要提取结果文件,必须使用tar的--ignore-zeros-i选项来不仅提取第一个存档:
tar xizf archive.tar.gz

-1
你可以使用find(带有-size标志)和xargs的组合将其传递到tar中。
类似这样:
find . -size -100k -print | xargs tar cvf archive.tar

对于小于100k的文件,请参阅find命令手册以获取其他大小选项。


-3
找到 ./myRep/ 目录下所有文件大小小于1024k的文件,并将它们打包成tar/gzip格式的归档文件。

5
可能会多次触发 tar。看一下 find . -print0 | tar --null -T - ...(来自 tar 手册:“如果您将单个破折号作为‘--files-from’的文件名(即指定--files-from=-或-T -),则文件名将从标准输入中读取。”)。 - Dr. Jan-Philip Gehrcke

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