有没有办法重定向写入的文件

有没有办法重定向写入的文件

我有一个无法更改的应用程序,它写入一个 250 GB 的大纯文本文件。用GZ压缩后只有30GB。

该应用程序没有压缩其输出的选项,并且只能写入文件名(不能写入标准输出)。

有没有一种方法可以设置立即压缩输出,而无需先将 250 GB 文件存储在磁盘上?

我还需要相反的方法,欺骗应用程序,使其读取实际上被压缩的纯文本文件。

答案1

您可能会成功使用/dev/stdout作为文件名并将应用程序的输出通过管道传输到gzip.

/dev/stdout是到 的符号链接/proc/self/fd/1

同样,您可以用作/dev/stdin文件名并将输出通过管道传输gzip到应用程序。

我说可能,因为应用程序可能需要写入(读取)可查找的文件,但/dev/std{in,out}不可查找。如果是这种情况,那么您可能会迷路。您将需要使用可查找文件作为应用程序的目标。

答案2

  • 使用可以mkfifo设置一个命名管道,程序将在其中写入,同时您可以gzip从该管道进入最终目的地。

  • 如果您可以在命令行上将输出文件名传递给程序,那么这个(可能是 bash 特定的)技巧也应该起作用:program >(gzip - >output.gz)因为这将由 shell 翻译成类似gzip - </dev/fd/63 >output.gz &; program /dev/fd/63.

答案3

最初,我想,这当然很简单:只需在程序期望写入的压缩文件系统上安装一个环回设备即可。不幸的是,在搜索时,我发现没有很多读/写文件系统,并且那里的内容(jffs2)无法通过环回设备安装。

我确实找到了熔断压缩这可能是您正在寻找的,但如果您需要高可靠性,我会跳过它。

另一种选择是将文件存储在 USB 硬盘上,并在程序写入的位置创建符号链接。如果您经常使用该程序或者您还没有 250GB 以上的 USB 驱动器,这可能会很麻烦。

答案4

如果应用程序不要求其输入和输出可查找,请传递它/dev/stdout<(gunzip <data.gz)— 请参阅卡姆的回答亚历克斯的回答

如果应用程序确实需要可查找文件,那么最好的选择是实现压缩的文件系统。有一些支持压缩的 UNIX 文件系统实现:

  • 通过保险丝,在大多数 unice 上都可用,有一些压缩文件系统熔断压缩复合熔丝有两种选择,以及各种归档文件系统
  • 兹夫斯支持一切,包括厨房水槽和压缩。它是当今 Solaris 下的本机文件系统(它的来源)。它是通过保险丝可用至少在 Linux 上是这样。 FreeBSD 和 NetBSD 至少有部分 zfs 的本机实现。
  • 在 Linux 上,有一些补丁可以在 ext2 及其衍生版本上实现压缩。我不知道它们的可靠性如何,也不知道它们与 ext3 和 ext4 的兼容性如何。

相关内容