You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何不使用split工具实现大文件的指定字节大小精确拆分

如何不使用split工具实现大文件的指定字节大小精确拆分

嘿,我来给你分享几种不用split工具实现大文件精确拆分的方法,完全能达到你要的每个分片120MiB、最后一个分片按需收尾的效果,不管是1GB还是更大的2GiB、3GiB文件都适用👇

方法一:用dd命令写循环脚本(最可靠)

dd是处理文件字节级操作的利器,我们可以写一个简单的shell循环,精确控制每个分片的大小和文件名,完全复刻split的效果。

示例脚本(针对你的1GB.bin场景)

#!/bin/bash
INPUT_FILE="1GB.bin"
CHUNK_SIZE=$((120 * 1024 * 1024))  # 直接用120MiB计算,更直观,结果等于125829120字节
CHUNK_PREFIX="xa"

# 获取输入文件的总字节数
TOTAL_SIZE=$(stat -c %s "$INPUT_FILE")

# 计算完整分片的数量和剩余字节数
FULL_CHUNKS=$((TOTAL_SIZE / CHUNK_SIZE))
REMAINING_BYTES=$((TOTAL_SIZE % CHUNK_SIZE))

# 循环生成完整分片
for i in $(seq 0 $((FULL_CHUNKS - 1))); do
    # 生成类似xaa、xab的文件名(97是ASCII码的a,依次递增)
    CHUNK_NAME="${CHUNK_PREFIX}$(printf "%c" $((97 + i)))"
    # 计算当前分片需要跳过的前置字节数
    SKIP_BYTES=$((i * CHUNK_SIZE))
    # 用dd提取对应字节段
    dd if="$INPUT_FILE" of="$CHUNK_NAME" bs=1 count="$CHUNK_SIZE" skip="$SKIP_BYTES" status=none
done

# 处理最后剩余的部分(如果有剩余)
if [ $REMAINING_BYTES -gt 0 ]; then
    LAST_CHUNK_NAME="${CHUNK_PREFIX}$(printf "%c" $((97 + FULL_CHUNKS)))"
    SKIP_BYTES=$((FULL_CHUNKS * CHUNK_SIZE))
    dd if="$INPUT_FILE" of="$LAST_CHUNK_NAME" bs=1 count="$REMAINING_BYTES" skip="$SKIP_BYTES" status=none
fi

脚本说明

  • stat -c %s:用来获取文件的总字节数,跨Linux发行版都能用
  • printf "%c":把循环索引转成小写字母,完美复刻split的文件名规则
  • ddskip参数:跳过前面已经处理过的字节,避免重复读取
  • status=none:关闭dd的进度输出,让脚本更干净

运行完脚本后,用du -b *xa*检查,结果会和你用split得到的完全一致:8个125829120字节的分片,最后一个41943040字节的分片。

方法二:用head+tail组合实现(更轻量)

如果你不想用dd,可以用更基础的headtail命令组合,同样能实现精确拆分。

示例脚本

#!/bin/bash
INPUT_FILE="1GB.bin"
CHUNK_SIZE=$((120 * 1024 * 1024))
CHUNK_PREFIX="xa"

TOTAL_SIZE=$(stat -c %s "$INPUT_FILE")
FULL_CHUNKS=$((TOTAL_SIZE / CHUNK_SIZE))
REMAINING_BYTES=$((TOTAL_SIZE % CHUNK_SIZE))

current_offset=0
for i in $(seq 0 $((FULL_CHUNKS - 1))); do
    CHUNK_NAME="${CHUNK_PREFIX}$(printf "%c" $((97 + i)))"
    # tail从第current_offset+1字节开始输出,head取前CHUNK_SIZE字节
    tail -c +$((current_offset + 1)) "$INPUT_FILE" | head -c "$CHUNK_SIZE" > "$CHUNK_NAME"
    current_offset=$((current_offset + CHUNK_SIZE))
done

# 处理剩余部分
if [ $REMAINING_BYTES -gt 0 ]; then
    LAST_CHUNK_NAME="${CHUNK_PREFIX}$(printf "%c" $((97 + FULL_CHUNKS)))"
    tail -c +$((current_offset + 1)) "$INPUT_FILE" > "$LAST_CHUNK_NAME"
fi

脚本说明

  • tail -c +N:表示从文件的第N个字节开始输出(注意这里计数从1开始,所以要加1)
  • head -c M:只保留前M个字节,刚好截取我们需要的分片大小

这个方法不需要依赖dd,用的都是最基础的shell命令,适合环境受限的场景。

通用适配说明

不管是2GiB(2147483648字节)还是3GiB(3221225472字节)的大文件,只需要修改脚本里的INPUT_FILECHUNK_SIZE参数就行,脚本会自动计算分片数量和剩余字节,完全不用手动算数值。

备注:内容来源于stack exchange,提问作者GERATISAN

火山引擎 最新活动