我有一个程序在磁盘上写入痕迹,并且大小变得非常大。通常,我使用以下命令。
./run output.txt
xz output.txt
我可以在写入output.txt的同时通过管道传输xz吗?
我读如何动态(递归地)将所有文件从 gzip 转换为 xz?,但我不确定它是否适用于我的情况。
答案1
如果您./run
在没有给出文件参数的情况下将其输出输出到 stdout(这是 Unix/Linux 中的惯例),那么您可以简单地使用:
./run | xz -c >output.txt.xz
如果它需要文件名参数,但如果可以很好地写入管道,那么您可以使用特殊设备,例如/dev/stdout
或/dev/fd/1
(两者应该是等效的),如下所示:
./run /dev/stdout | xz -c >output.txt.xz
或者你可以使用流程替代,这通常在大多数现代 shell 中可用,例如 bash、zsh 或 ksh,最终将使用/dev/fd
幕后的设备来完成相同的任务:
./run >(xz -c >output.txt.xz)
最后一个也需要./run
能够写入管道,但如果./run
写入到管道,它应该比其他管道工作得更好output.txt
和在正常操作中重定向到 stdout,在这种情况下,如果将两者都重定向到 stdout,输出将会混淆。
程序通常可以写入管道,但其中一些程序可能想要查找并倒回到输出文件中的偏移量,这在管道中是不可能的。如果是这种情况,那么写入临时文件然后压缩它可能就是您所能做的。