如何不使用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的文件名规则dd的skip参数:跳过前面已经处理过的字节,避免重复读取status=none:关闭dd的进度输出,让脚本更干净
运行完脚本后,用du -b *xa*检查,结果会和你用split得到的完全一致:8个125829120字节的分片,最后一个41943040字节的分片。
方法二:用head+tail组合实现(更轻量)
如果你不想用dd,可以用更基础的head和tail命令组合,同样能实现精确拆分。
示例脚本
#!/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_FILE和CHUNK_SIZE参数就行,脚本会自动计算分片数量和剩余字节,完全不用手动算数值。
备注:内容来源于stack exchange,提问作者GERATISAN




