假设您有两个巨大的文件(几 GB)想要连接在一起,但您的空闲磁盘空间非常少(比如说几百 MB)。也就是说,给定 file1file2, ,您希望最终得到一个文件,它是连接的结果 file1file2 逐字节组合在一起,并删除原始文件。

你不能做显而易见的事 cat file2 >> file1; rm file2, ,因为在这两个操作之间,您将耗尽磁盘空间。

欢迎使用免费或非免费工具的任何及所有平台上的解决方案;这是我前几天下载 Linux ISO 时想到的一个假设问题,由于无线故障,下载中途中断。

有帮助吗?

解决方案

我认为困难在于确定如何从原始文件中恢复空间。

我认为以下内容可能有效:

  1. 分配一个稀疏文件 合并尺寸。
  2. 将100Mb从第二个文件的末尾复制到新文件的末尾。
  3. 截断第二个文件末尾的100Mb
  4. 循环2 <!>放大器; 3直到您完成第二个文件(将2.修改为目标文件中的正确位置)。
  5. 做2 <!> amp; 3 <!> amp; 4但是带有第一个文件。
  6. 这一切都依赖于稀疏文件支持和文件截断立即释放空间。

    如果您确实想要这样做,那么您应该调查dd命令。哪个可以进行复制步骤

    另一个回答中的某个人给出了一个不需要稀疏文件的简洁解决方案,但是复制了两次文件:

    1. 将100Mb块从文件2的末尾复制到新文件3,以相反的顺序结束。在你去的时候截断文件2.
    2. 将文件3末尾的100Mb块复制到文件1中,最后按原始顺序复制块,位于文件1的末尾。随后截断文件3.

其他提示

花时间计算出涉及磁盘扇区改组和文件链操作的巧妙解决方案:2-4小时

获取/编写软件以进行就地复制和截断的时间:2-20小时

倍中位数$ 50 /小时程序员费率:$ 400- $ 1200

1TB USB驱动器的成本:100美元至200美元

能够理解短语<!>“机会成本<!>”:无价值

这是比我的稍微改进的 第一个答案.

如果您有 100MB 可用空间,请复制第二个文件中的最后 100MB 并创建第三个文件。截断第二个文件,使其缩小 100MB。重复此过程,直到第二个文件完全分解为单独的 100MB 块。

现在,每个 100MB 文件都可以一次附加到第一个文件中。

有了这些限制,我希望你需要篡改文件系统;直接编辑文件大小和分配块。

换句话说,忘记改组文件内容的任何块,只需编辑有关这些文件的信息。

如果文件是高度可压缩的(即日志):

gzip file1

gzip file2

zcat file1 file2 | gzip > file3

rm file1

rm file2

gunzip file3

冒着轻浮的风险,您是否考虑过选择更大的磁盘?它可能会更快......

效率不高,但我认为可以做到。

以附加模式打开第一个文件,并将第二个文件中的块复制到该文件,直到磁盘快满为止。对于第二个文件的其余部分,通过随机访问I / O将块从您停止的位置复制到文件的开头。复制完最后一个块后截断文件。重复直到完成。

显然,经济上的答案是购买更多的存储空间,假设这是一个可能的答案。但它可能不是 - 嵌入式系统无法连接更多存储设备,甚至无法访问设备本身 - 例如,飞行中的太空探测器。

如果你有一个稀疏文件系统,那么基于稀疏文件系统的前面提到的答案是好的(除了出现问题之外的破坏性质!)。如果你不这样做怎么办?

从文件2的末尾开始复制块到目标文件的开头,然后将它们反转。在每个块之后,您将源文件截断为未复制的长度。重复文件#1。

此时目标文件向后包含所有数据,源文件消失。

从tart和目标文件的末尾读取一个块,将它们反转并将它们写入另一个来自的位置。按照你的方式向前翻转。

完成后,目标文件是源文件的串联。不需要稀疏文件系统,不需要处理所需的文件系统。这可以在零字节空闲时执行,因为数据可以保存在存储器中。

好吧,仅供理论娱乐,前提是您保证不浪费时间实际这样做:

  • 文件以碎片形式存储在磁盘上
  • 这些碎片连接成一条链条

因此,您可以通过以下方式连接文件:

  • 将第一个文件的最后一部分链接到最后一个文件的第一部分
  • 更改第一个文件的目录条目以更改最后一个文件和文件大小
  • 删除最后一个文件的目录条目
  • 清理第一个文件的文件结束标记(如果有)
  • 请注意,如果第一个文件的最后一段仅部分填充,您将必须将数据“向上”复制到最后一个文件的段,以避免文件中间出现垃圾[感谢@Wedge!]

这将是最佳效率:最少的更改、最少的复制、不需要备用磁盘空间。

现在去买一个 USB 驱动器;-)

两个想法:

如果你有足够的物理RAM,你实际上可以将第二个文件完全读入内存,删除它,然后以追加模式将其写入第一个文件。当然如果你在删除之后但在完成写入之前失去了权力,你就会丢失部分第二个文件。

暂时减少操作系统功能使用的磁盘空间(例如虚拟内存,<!>“;回收站<!>”或类似内容)。可能只在Windows上使用。

我怀疑这是对这个问题的直接回答。您可以将此视为解决问题的替代方法。

我认为可以将第二个文件视为第一个文件的第2部分。通常在zip应用程序中,我们会看到一个巨大的文件被分成多个部分。如果您打开第一部分,应用程序将自动考虑其他部分进行进一步处理。

我们可以在这里模拟同样的事情。正如@edg所指出的,修补文件系统将是一种方式。

你可以这样做:

head file2 --bytes=1024 >> file1 && tail --bytes=+1024 file2 >file2 

你可以根据你有多少额外的磁盘空间来增加1024,然后重复这个,直到所有字节都被移动。

这可能是最快的方式(就开发时间而言)

您可以通过压缩整个文件系统来获得空间。我相信NTFS支持这一点,我相信有一些* nix文件系统可以支持它。它还有一个好处,就是在复制文件后,你仍然会有比剩下更多的磁盘空间。

好的,稍微改变一下这个问题。磁盘上还有其他你不需要的东西,但你不知道它是什么或它在哪里。如果你能找到它,你可以删除它,然后你可能有足够的额外空间。

要找到这些<!>“肿瘤<!>”,无论是几个大的,还是许多小的,我都会使用一些小的采样程序。从目录(或根目录)的顶部开始,它进行两次传递。在第1遍中,它遍历目录树,将所有文件的大小相加以获得总共N个字节。在第2遍中,它再次遍历目录树,假装它正在读取每个文件。每次传递N / 20个字节时,它都会打印出目录路径和文件名,它是<!> quot; reading <!> quot;。因此,最终结果是20个深度的路径名样本均匀地分布在目录下的所有字节中。

然后只看那些显示你不需要的东西的清单,然后把它吹走。

(这是我用于性能优化的采样方法的空间等效。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top