使用dd命令拆分文件求助:将10627字节文件拆分为100字节小文件
问题分析及修复方案
你的脚本存在两个关键错误,还有一个可优化的细节:
1. dd的skip参数单位理解错误
当你设置bs=100时,skip的单位是块数(每块对应100字节),而非字节数。你脚本里的skip_byte每次累加100,导致第二次执行dd时,skip=100意味着跳过100个块(也就是10000字节),直接跳到文件第10001字节,中间的99块内容完全被跳过。
2. 输入文件名不匹配
你通过man sed > man_sed生成的文件名为man_sed,但脚本里dd的输入文件写的是sed_man,文件名错误会直接导致dd找不到文件而报错退出。
潜在问题:循环终止逻辑不够严谨
当读取到文件最后一块(不足100字节)时,dd会正常完成读取并返回0退出码,你的循环会继续执行下一次,直到skip超过文件总块数才会退出,这时候会多生成一个空文件。
修复后的脚本
skip_blocks=0 rec_count=1 input_file="man_sed" while true; do dd if="$input_file" of="sed_man_part_${rec_count}.txt" bs=100 count=1 skip="$skip_blocks" # 检查输出文件是否为空,空文件则删除并终止循环 if [ ! -s "sed_man_part_${rec_count}.txt" ]; then rm "sed_man_part_${rec_count}.txt" break fi skip_blocks=$(( skip_blocks + 1 )) rec_count=$(( rec_count + 1 )) done
修复说明:
- 将
skip_byte改为skip_blocks,每次累加1,匹配dd的块单位逻辑,确保每次跳过的是上一次读取的100字节块。 - 修正输入文件名,和你生成的
man_sed保持一致。 - 新增空文件检查逻辑:如果生成的文件无内容,直接删除并终止循环,避免生成多余的空文件。
内容的提问来源于stack exchange,提问作者Jitendra Yadav
相关产品推荐
相关产品推荐

