You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:02:51