如何不使用split工具按指定大小拆分大字节文件
如何不使用split工具按指定大小拆分大字节文件
我来给你分享两个不用split工具就能实现指定大小拆分文件的方法,亲测有效,完全能达到你想要的效果——每个分片120MiB(125829120字节),最后一个分片取剩余的字节数:
方法一:用Bash脚本配合dd命令实现
这个方法纯靠shell自带工具就能完成,适合Linux/Unix环境。核心思路是通过计算每个分片的起始偏移量,用dd命令精准读取对应字节范围写入新文件:
#!/bin/bash # 配置参数 SOURCE_FILE="1GB.bin" CHUNK_SIZE=$((120 * 1024 * 1024)) # 120MiB 转成字节数 # 获取源文件总字节数(Linux用下面这条,macOS换成 stat -f %z "$SOURCE_FILE") TOTAL_SIZE=$(stat -c %s "$SOURCE_FILE") # 计算完整分片数和剩余字节数 FULL_CHUNKS=$((TOTAL_SIZE / CHUNK_SIZE)) REMAINING=$((TOTAL_SIZE % CHUNK_SIZE)) # 生成完整的分片文件 for ((i=0; i<FULL_CHUNKS; i++)); do # 生成和split一致的文件名:xaa、xab、xac... FILE_NAME=$(printf "xa%c" $((97 + i))) # 计算当前分片的起始偏移量 OFFSET=$((i * CHUNK_SIZE)) # 用dd读取指定范围的字节写入新文件 dd if="$SOURCE_FILE" of="$FILE_NAME" bs=1 skip="$OFFSET" count="$CHUNK_SIZE" status=none done # 处理最后一个剩余的分片 if [ $REMAINING -gt 0 ]; then LAST_FILE=$(printf "xa%c" $((97 + FULL_CHUNKS))) LAST_OFFSET=$((FULL_CHUNKS * CHUNK_SIZE)) dd if="$SOURCE_FILE" of="$LAST_FILE" bs=1 skip="$LAST_OFFSET" count="$REMAINING" status=none fi
关键点说明:
stat -c %s:用来获取文件的总字节数,macOS环境需要换成stat -f %zdd的参数:bs=1表示按字节单位处理,skip跳过前面的偏移字节,count指定读取的字节数,status=none用来关闭dd的默认进度输出,让脚本更干净- 文件名生成:用
printf "xa%c"配合ASCII码(97是小写a),生成和split完全一致的文件名格式
方法二:用Python脚本实现
这个方法跨平台,只要有Python环境(Windows/Linux/macOS都能用)就能运行,逻辑更直观:
source_file = "1GB.bin" chunk_size = 120 * 1024 * 1024 # 120MiB 对应的字节数 chunk_index = 0 # 以二进制模式打开源文件 with open(source_file, "rb") as src_f: while True: # 每次读取指定大小的内容 chunk_data = src_f.read(chunk_size) # 如果读取到空,说明文件已经读完 if not chunk_data: break # 生成和split一致的文件名:xaa、xab... chunk_name = f"xa{chr(97 + chunk_index)}" # 将读取到的内容写入分片文件 with open(chunk_name, "wb") as chunk_f: chunk_f.write(chunk_data) chunk_index += 1
关键点说明:
- 二进制模式:用
rb和wb模式打开文件,避免文本模式的编码问题,确保字节级别的精准读取 - 循环读取:每次读取
chunk_size字节,直到返回空字节串,自动处理最后一个分片的剩余内容 - 文件名生成:用
chr(97 + chunk_index)生成小写字母后缀,和split的命名规则完全匹配
验证结果
运行完上面任意一个脚本后,你可以用du -b *xa*命令检查分片文件的大小,结果会和使用split工具得到的完全一致:
125829120 xaa 125829120 xab 125829120 xac 125829120 xad 125829120 xae 125829120 xaf 125829120 xag 125829120 xah 41943040 xai
备注:内容来源于stack exchange,提问作者GERATISAN
相关产品推荐
相关产品推荐

