写入磁盘并同时使用 xz 压缩

mah*_*ood 5 bash pipe xz

我有一个在磁盘上写入跟踪的程序,并且大小变得非常大。通常,我使用以下命令。

./run output.txt
xz output.txt
Run Code Online (Sandbox Code Playgroud)

我可以在写入 output.txt 的同时管道 xz 吗?

我阅读了如何将所有文件从 gzip 动态转换为 xz(并递归地)?,但我不确定它是否适用于我的情况。

fil*_*den 17

如果您./run将在没有给出文件参数的情况下将其输出生成到 stdout(这是 Unix/Linux 中的惯例),那么您可以简单地使用:

./run | xz -c >output.txt.xz
Run Code Online (Sandbox Code Playgroud)

如果它需要一个文件名参数,但如果它可以很好地写入管道,那么您可以使用一个特殊的设备,例如/dev/stdout/dev/fd/1(两者都应该是等效的),如下所示:

./run /dev/stdout | xz -c >output.txt.xz
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用进程替换,它通常在大多数现代 shell(例如 bash、zsh 或 ksh)中可用,最终将使用/dev/fd幕后的设备来完成相同的任务:

./run >(xz -c >output.txt.xz)
Run Code Online (Sandbox Code Playgroud)

最后一个还需要./run能够写入管道,但如果在正常操作中./run写入output.txt 写入stdout ,它应该比其他管道工作得更好,在这种情况下,如果将两者都重定向到 stdout,输出会混淆。

程序通常可以写入管道,但其中一些程序可能想要在输出文件中查找和倒带偏移量,这在管道中是不可能的。如果是这种情况,那么写入临时文件然后压缩它可能就是您所能做的。