【问题标题】:Way to delete the already decompressed portion of a file as it is being decompressed?在解压缩文件时删除文件已解压缩部分的方法?
【发布时间】:2012-12-31 18:13:59
【问题描述】:

我想知道是否有一种方法可以在文件被解压缩时删除它已经解压缩的部分。我有压缩文件的外部备份,所以我不担心丢失数据。该文件是bz2。我希望这样做,因为驱动器上只有 50 GB 可用空间,压缩文件为 33 GB。如果我在解压时无法删除文件的某些部分,那么解压后的文件将没有足够的空间。

我可以做其他事情来解决这个问题,但我很想知道我上面提到的是否可行。

【问题讨论】:

  • 你正在编写一个这样的程序吗?如果是这样,它是什么语言,你使用的是什么 BZip2 库?如果不是,那么 - 这似乎不是一个编程问题,它可能属于 Super User
  • 我想我的问题是你是否知道我怎样才能达到预期的结果。我愿意使用 bash、python 或 php 来完成工作(它们已经在服务器上),所以如果你知道能够做到这一点的语言和库,我愿意编写一个程序。我不确定超级用户是否是一个更好的地方来问这个问题,但我会在那里问你是否觉得它更合适。
  • stackoverflow.com/questions/9995093/…。从压缩文件中读取块后,使用该技术将块替换为孔。
  • 其实,等一下,我很困惑。如果压缩文件为 33GB,那么 未压缩 文件可能太大而无法容纳 50GB 的可用空间,不是吗?
  • 不,大约 42GB。

标签: linux bash compression tar bzip2


【解决方案1】:

一般来说,无法删除文件的开头部分 - 您只能截断文件的结尾部分。

然而,较新的 Linux 内核支持在文件中打孔针对特定文件系统using the fallocate() system call。有一个 corresponding utility 可以用于相同的目的,但您需要一个相对较新的版本(2.21 或更高版本)的 util-linux 软件包,以便在该实用程序中包含打孔支持。​​

请记住,打孔仍然相对较新,kernel bugs still pop-up - 您最好只清理文件系统以释放一些空间。

【讨论】:

  • 这看起来是唯一可以完成我正在寻找的答案,但考虑到你提到的事情,即使我的文件系统确实支持这个(它不支持),我可能不会使用它。我想我会删除压缩文件,然后通过 sftp 连接传输解压缩的文件 - 需要几天的 OTL。感谢大家的回复!
【解决方案2】:

如果我理解正确,您希望在压缩文件开头的部分被读取、解压缩和写入后删除。

这通常是不可能的,因为在 Unix 下,如果不重写文件的其余部分就无法删除文件的初始部分(可以在不重写的情况下从末尾截断文件,但是不能解决手头的问题)。不过,具有 holes 概念的文件系统可能是一种选择。

但是,也许您可​​以创建更小的压缩文件,例如 33 个 1GB 的压缩文件。然后很容易删除您已经解压缩的文件。

【讨论】:

  • 从小文件开始的想法很聪明。我认为 tar 实际上可以做到这一点,以便您可以将备份存储在多个磁带上。此外,在创建所有部分之前,拆分命令不会删除原始文件(因此我现在无法拆分文件)。不幸的是,我得到了这个 33GB 的文件。
  • B 计划:投资 50 美元购买 500+GB 的磁盘,再也不用担心 :-)
【解决方案3】:

最明显的解决方案是编写一个过滤器来处理解压缩的输出,在输出中寻找您需要的任何内容。

bunzip2 -c compressedfile.bz2 | yourfilterprogram

-cdirects bunzip2 to decompress to stdout.

使用这种技术,未压缩的文件根本不会存储在磁盘上。

【讨论】:

  • 您不需要-c 选项将输出发送到标准输出,而不是写入(未)压缩文件吗?祝大家好运。
  • @shellter: -cbunzip2 的手册页中未提及,仅适用于 bzip2。无论如何,bzcat 可能是这个用途的更好选择。
  • 不确定我是否理解正确。我想要解压缩文件的所有内容。我想消除压缩文件中已经解压的部分。听起来像这样解压缩,然后只返回压缩文件的一部分。
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2010-09-05
  • 2013-03-09
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多