截断管道中的文件

kos*_*tmo 4 pipe bash-scripting

有没有一种简单的方法来截断管道中的文件?具体来说,我想在将文件送入另一个进程之前切掉文件的最后四个字节。

理想情况下,我可以这样写:

cat input.txt | some-process | truncate --size=-4 | another-process > output.txt

但似乎该truncate命令仅在磁盘上的文件上“就地”操作。

Pau*_*ter 6

这就像我告诉你,我要说的倒数第四个词一说完就举手。我不会事先告诉你我要说多少话。

管道是一个。它的数据没有大小,它只有从中获取下一个元素和/或向其中插入元素的操作,结果要么是一条数据,要么是没有更多数据的信号。

因此,除非您首先从流中检索所有数据,将其放入缓冲区,计算其长度,“倒带”流,然后检索少四个元素,否则无法完成。

编辑:我需要做更多的思考而不是想出聪明的类比:) 流不会说“在最后一个元素之前立即停止我”,而是“传输除最后 n 个元素之外的所有元素”,并通过维护一个只有 n 个元素的缓冲区,并且在传输第一个元素之前等待前 n 个元素被接收,这是可能的。显然,这在像电信这样的情况下是行不通的,在这种情况下,您希望在收到数据后立即发送数据,就像您想要前 n 个元素一样。我认为truncate不会这样做。

(试图downvoting self -1)


kos*_*tmo 5

写完那个 Python 脚本后,我觉得很傻。

有一个内置的 shell 命令head可以做到这一点:

cat input.txt | some-process | head --bytes=-4 | another-process > output.txt

编辑: GNUhead命令在概念上与下面的Python 实现相似的实现(即内存效率高)。一个区别是它将循环缓冲区的大小(N,省略的字节数)向上舍入为某个标准缓冲区大小的倍数。