如何不使用Linux split工具将9840497字节拆分为3个不等长度并存入数组
不使用split工具拆分字节为不等长度并存入数组
Linux中的split工具可完成文件拆分操作,示例如下:
$ du -b file.mp4 9840497 file.mp4 $ split -e --number=3 --verbose file.mp4 && du -b xa* 3280165 xaa 3280165 xab 3280167 xac
但split生成的前两部分大小相同,且直接用整数除法仅能得到单个基础拆分大小:
$ parts=$((9840497 / 3)) $ echo -n "$parts" 3280165
下面介绍两种不依赖split工具,将9840497字节拆分为3个不等长度并存入数组的方法:
方法1:手动指定前两部分,计算第三部分
直接自定义两个不同的拆分长度,第三部分通过总字节数减去前两部分的和得到,确保总和一致且三个长度不等:
total=9840497 # 自定义两个不等的拆分值 part1=3280100 part2=3280200 # 计算第三部分 part3=$((total - part1 - part2)) # 将结果存入数组 split_parts=($part1 $part2 $part3) # 验证结果 echo "拆分后的三个部分:${split_parts[@]}" echo "总和验证:$((part1 + part2 + part3))"
执行后会得到三个不等的数值,且总和与原字节数完全一致。
方法2:基于余数的动态不等分配
如果需要更通用的逻辑,可基于基础拆分值和余数调整,生成完全不等的拆分结果:
total=9840497 num_parts=3 base=$((total / num_parts)) remainder=$((total % num_parts)) split_parts=() # 循环生成拆分长度,通过调整让三个值不等 for ((i=0; i<num_parts; i++)); do if [ $i -eq 0 ]; then # 第一个部分比基础值少1 split_parts+=($((base - 1))) elif [ $i -eq $((num_parts - 1)) ]; then # 最后一个部分承担余数并额外加1,确保与其他部分不等 split_parts+=($((base + remainder + 1))) else # 中间部分用基础值 split_parts+=($base) fi done # 验证结果 echo "拆分后的三个部分:${split_parts[@]}" echo "总和验证:$(( ${split_parts[0]} + ${split_parts[1]} + ${split_parts[2]} ))"
该方法会生成3280164、3280165、3280168三个不等的长度,总和恰好为9840497字节。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

