【问题标题】:How to exclude big files while compressing a directory with tar如何在使用 tar 压缩目录时排除大文件
【发布时间】:2012-03-20 19:44:36
【问题描述】:

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

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

【问题讨论】:

    标签: linux command-line gzip tar compression


    【解决方案1】:

    根据 Jan-Philip Gehrcke 的回复:

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

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

    【讨论】:

    • 在 debian 挤压上我有这个错误:tar: Multiple archive files require '-M' option 但它适用于类似的东西:find . -type f -size -100k | tar -cz -f test.tgz -T -
    • @Fluxine 也无法正常工作。不得不查看stackoverflow.com/q/5891866/63736 并最终得到find . -type f -size 1M -print0 | tar -vzcf backup.tar.gz --null -T -
    • ...| tar c --null -T - 解决方案可以很好地处理任意长的文件列表,但有一个小缺点:它将整个文件列表存储在内存中。如果您有很多小文件,那么这可能是个问题。
    • 我在 Ubuntu 上打印出很长的文件,例如 ./file1\n./file1./file3\n 和错误 Cannot stat: File name too long tar: Exiting with failure status due to previous errors
    • 可以通过包含-print0来修复,如this discussion中所述
    【解决方案2】:

    如果你有足够的内存,上面的...| 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
    

    【讨论】:

      【解决方案3】:

      您可以结合使用 find(及其 -size 标志)和 xargs 将其传递给 tar。

      类似:

      find . -size -100k -print | xargs tar cvf archive.tar
      

      对于小于 100k 的文件。查看 man find 了解其他尺寸选项

      【讨论】:

        【解决方案4】:

        找到 ./myRep/ -type f -size -1024k | xargs tar cfvz myArchive.tar

        总之,这个表达式的第一部分从 ./myRep/ 递归构造一个小于 1024k 的文件列表,第二部分创建 tar/gzip 存档。

        【讨论】:

        • 这可能会重复调用 tar。看看find . -print0 | tar --null -T - ...(来自 tar 手册:“如果你给一个破折号作为 '--files-from' 的文件名,(即,你指定 --files-from=- 或 -T -) , 然后从标准输入中读取文件名。")
        猜你喜欢
        • 1970-01-01
        • 2014-01-17
        • 2011-03-21
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多