如何解决dd:读取二进制文件作为大小为 N 的块返回的数据少于 N
我需要在段中处理大型二进制文件。从概念上讲,这类似于 split,但不是将每个段写入文件,而是需要将该段作为另一个进程的输入发送。我以为我可以使用 dd
分块读/写文件,但结果完全不是我所期望的。例如,如果我尝试:
dd if=some_big_file bs=1M |
while : ; do
dd bs=1M count=1 | processor
done
...输出大小实际上是 131,072
字节而不是 1,048,576
。
谁能告诉我为什么我没有看到输出被阻塞到 1M
块以及我如何才能更好地完成我想要做的事情?
谢谢。
解决方法
首先,您不需要第一个 dd
。 cat file | while
或 done < file
也可以解决问题。
dd bs=1M count=1
可能返回小于 1M,请参阅
When is dd suitable for copying data? (or,when are read() and write() partial)
使用带有(非posix)选项dd count=…
的{{1}}代替head
。
-c …
或者符合posix但效率很低
file=some_big_file
(( m = 1024 ** 2 ))
(( blocks = ($(stat -c %s "$file") + m - 1) / m ))
for ((i=0; i<blocks; ++i)); do
head -c "$m" | processor
done < "$file"
,
根据dd的manual:
-
bs=bytes
[...] 如果没有指定数据转换
conv
选项,输入被读取后立即复制到输出,即使它小于块大小 .
所以试试dd iflag=fullblock
:
-
全块
从输入中累积完整块。
read
系统调用可能 如果没有可用的完整块,请提前返回。当那个 发生,继续调用read
来填充剩余的 堵塞。此标志只能与iflag
一起使用。这个标志是 例如,对管道很有用,因为它们可能返回短读。 在这种情况下,需要此标志来确保count=
参数被解释为块计数而不是计数 读取操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。