如何将 tar 文件在文件边界处分割成更小的部分?

如何将 tar 文件在文件边界处分割成更小的部分?

我有一个 tar 文件,我想将其拆分成多个较小的 tar 文件。使用 很容易split,但我希望拆分后的文件本身是完全可用的 tar 文件,但这split无法实现,因为它会在任意点(而不是文件边界)进行拆分。

那么,怎样在文件边界处将 tar 文件分割成更小的部分,以便没有一个文件最终一半在一个 tar 中,一半在另一个 tar 中?

不使用 tar 并通过其他方式完成任务的解决方案也会受到欢迎。

PS:是的,有些情况下这是不可能的(tar 文件大于分割大小)。

答案1

有一个工具tarsplitter可以安全地分割 tar 档案。你指定要将档案分割成的部分数,它就会找出文件边界的位置。

https://github.com/AQUAOSOTech/tarsplitter

输出的较小档案不会完全相同大小,但非常接近 - 假设原始档案中的文件没有太多变化。

示例 - 将档案“files.tar”拆分为 4 个较小的档案:

tarsplitter -p 4 -i files.tar -o /tmp/parts

创建:

/tmp/parts0.tar
/tmp/parts1.tar
/tmp/parts2.tar
/tmp/parts3.tar

答案2

如果重新创建档案是一个选项,那么这个 Bash 脚本应该可以解决问题(这只是一种可能的方式):

/bin/bash #!/bin/bash

如果 [ $# != 3 ] ; 那么
    echo -e "$0 输入 输出最大值\n"
    echo -e "\tin:输入目录"
    echo -e "\tout:输出目录"
    echo -e "\tmax:分割大小阈值(以字节为单位)"
    出口

输入=$1 输出=$2 最大值=$3 顺序=0 总和=0
查找 $IN -type f |
当读取 i 时;执行 du -bs "$i" ;完成|
排序 -n |
读取 SIZE NAME 时执行
    如果 [ $TOT != 0 ] && [ $((TOT+SIZE)) -gt $MAX ] ; 然后
        序列=$((序列+1))TOT=0
    TOT=$((TOT+尺寸))
    TAR=$OUT/$(printf'%08d'$SEQ).tar
    tar rf $TAR "$NAME"
完毕

它按大小对所有文件进行排序(升序)并开始创建档案;当大小超过阈值时,它会切换到另一个。

笔记:确保输出目录是空的。

使用风险自负

答案3

我不相信有任何现有工具可以做到这一点,但自己实现起来相当容易。tar 格式非常简单,所以你只需要有一个split考虑到它的工具。基本理论是读取标头,查看传入文件的规定长度,并确定是立即拆分还是写出当前文件。读取下一个标头,然后重复。

答案4

@ruffrey 提供的命令tarsplitter看起来是个很棒的选项。
我下载了它,然后执行以下操作:

brew install golang

才能编译它。(嗯...它已经在 Homebrew 中了吗?没有。)该命令在 10.14 版的 Mac 上成功编译。我目前正在复制我的巨大档案以tarsplitter针对它运行。对此建议表示赞赏。

在编译其他人的代码方面,我是个新手,所以如果作者能明确说明它是用 GO 而不是 C/C++ 编写的,并且需要安装新的编译器,那会很有帮助。另外,make install由于没有安装,所以不起作用Makefile,所以我只是做了:

cp build/tarsplitter_mac /usr/local/bin/tarsplitter

为 Mac、Linux 和 Windows 构建的 GO 编译器非常棒。

相关内容