Linux Shell中不拆分文件,生成curl分块上传的范围与长度参数
大文件分片curl上传的Shell实现(无split工具)
已知目标文件Zorin-OS-16.2-Core-64-bit.iso总大小为3071934464字节,需通过curl的--range选项分片上传,且必须指定Content-Length避免413错误。以下是3段和4段分片的具体实现方案:
3段分片实现
参数计算逻辑
总大小记为SIZE=3071934464,按大致均分原则划分:
- 第一段:范围
0-$((SIZE/3 -1)),对应Content-Length为$((SIZE/3)) - 第二段:范围
$((SIZE/3))-$((2*SIZE/3 -1)),对应Content-Length为$((SIZE/3)) - 第三段:范围
$((2*SIZE/3))-(或简写为-$((SIZE - 2*SIZE/3))),对应Content-Length为$((SIZE - 2*SIZE/3))
Shell脚本(参数存入数组)
# 获取文件总大小 SIZE=$(du -b Zorin-OS-16.2-Core-64-bit.iso | awk '{print $1}') # 计算3段参数并存入数组 readarray -t segments < <( echo "range=0-$((SIZE/3 -1))&length=$((SIZE/3))" echo "range=$((SIZE/3))-$((2*SIZE/3 -1))&length=$((SIZE/3))" echo "range=$((2*SIZE/3))-&length=$((SIZE - 2*SIZE/3))" ) # 循环执行上传 for seg in "${segments[@]}"; do RANGE=$(echo "$seg" | awk -F'&' '{split($1,a,"="); print a[2]}') LENGTH=$(echo "$seg" | awk -F'&' '{split($2,a,"="); print a[2]}') curl -k -v -i -X PUT -T 'Zorin-OS-16.2-Core-64-bit.iso' \ -H "Content-Length: $LENGTH" \ --range "$RANGE" done
4段分片实现
参数计算逻辑
总大小记为SIZE=3071934464,前3段均分,最后一段处理剩余字节:
- 第一段:范围
0-$((SIZE/4 -1)),对应Content-Length为$((SIZE/4)) - 第二段:范围
$((SIZE/4))-$((2*SIZE/4 -1)),对应Content-Length为$((SIZE/4)) - 第三段:范围
$((2*SIZE/4))-$((3*SIZE/4 -1)),对应Content-Length为$((SIZE/4)) - 第四段:范围
$((3*SIZE/4))-(或简写为-$((SIZE - 3*SIZE/4))),对应Content-Length为$((SIZE - 3*SIZE/4))
Shell脚本(参数存入数组)
# 获取文件总大小 SIZE=$(du -b Zorin-OS-16.2-Core-64-bit.iso | awk '{print $1}') # 计算4段参数并存入数组 readarray -t segments < <( echo "range=0-$((SIZE/4 -1))&length=$((SIZE/4))" echo "range=$((SIZE/4))-$((2*SIZE/4 -1))&length=$((SIZE/4))" echo "range=$((2*SIZE/4))-$((3*SIZE/4 -1))&length=$((SIZE/4))" echo "range=$((3*SIZE/4))-&length=$((SIZE - 3*SIZE/4))" ) # 循环执行上传 for seg in "${segments[@]}"; do RANGE=$(echo "$seg" | cut -d'&' -f1 | cut -d'=' -f2) LENGTH=$(echo "$seg" | cut -d'&' -f2 | cut -d'=' -f2) curl -k -v -i -X PUT -T 'Zorin-OS-16.2-Core-64-bit.iso' \ -H "Content-Length: $LENGTH" \ --range "$RANGE" done
可选:参数存入文本文件
如果需要将分片参数持久化到文本文件,可使用以下方式:
# 生成3段参数文件 SIZE=$(du -b Zorin-OS-16.2-Core-64-bit.iso | awk '{print $1}') { echo "0-$((SIZE/3 -1)) $((SIZE/3))" echo "$((SIZE/3))-$((2*SIZE/3 -1)) $((SIZE/3))" echo "$((2*SIZE/3))- $((SIZE - 2*SIZE/3))" } > segments_3.txt # 读取文件执行上传 while read -r range length; do curl -k -v -i -X PUT -T 'Zorin-OS-16.2-Core-64-bit.iso' \ -H "Content-Length: $length" \ --range "$range" done < segments_3.txt
内容的提问来源于stack exchange,提问作者July Elizabeth
相关产品推荐
相关产品推荐

