如果我想运行somecommand > somefile
但在somefile
达到一定大小后停止它,我该怎么做?
答案1
somecommand | dd bs=1K count=2 iflag=fullblock > somefile
这将向文件写入恰好 2 KiB(如果somecommand
先终止则更少)。POSIXiflag=fullblock
不要求这样做,您的命令dd
可能不支持它,包含的命令iflag=fullblock
不可移植。比较这种情形看看它为何重要。
处理正确数量的块(count=2
在上面的例子中)dd
终止后,这将中断管道。这取决于somecommand
它对破裂的管道的反应。参见:什么原因导致 Unix 进程因管道损坏而死亡?
如果您要保留的字节数迫使您使用一些不方便的bs
和/或count
,请考虑以下事项:
somecommand | { dd bs=1M count=1024 iflag=fullblock; dd bs=10 count=1 iflag=fullblock; } > somefile
该命令将写入 1 GiB(=1024 MiB)加上 10 个字节。
的一些实现head
允许您使用-c
选项获取任意数量的字节。这也是不可移植的,POSIX 不要求该选项。
根据这个答案 dd
输入块大小为 1 ( ibs=1
) 是读取精确字节数的唯一 POSIX 方法。
如果somecommand
生成文本输出并且您想要限制文件中的行数,head
那么这是正确的工具。这将仅保存前 5 行(同样,less ifsomecommand
首先终止):
somecommand | head -n 5 > somefile
POSIX 要求使用-n
选项。head