我有一个 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 编译器非常棒。