Linux 如何合并两个大文件

Linux 如何合并两个大文件,linux,file,merge,Linux,File,Merge,假设我有两个文件,每个文件大小为100G。我想把它们合并成一个,然后删除它们。在linux中 我们可以使用 cat文件1文件2>最终文件 但这需要读取两个大文件,然后写入一个更大的文件。是否可以将一个文件附加到另一个文件,这样就不需要IO?由于文件的元数据包含文件的位置和长度,我想知道是否可以更改文件的元数据以进行合并,因此不会发生IO。不,不可能通过处理元数据来合并(在Linux上)两个大文件 也许你可以考虑一些数据库来做你的工作。< /P> 正如Alexandre所注意到的,您可以将一个大文

假设我有两个文件,每个文件大小为100G。我想把它们合并成一个,然后删除它们。在linux中 我们可以使用

cat文件1文件2>最终文件


但这需要读取两个大文件,然后写入一个更大的文件。是否可以将一个文件附加到另一个文件,这样就不需要IO?由于文件的元数据包含文件的位置和长度,我想知道是否可以更改文件的元数据以进行合并,因此不会发生IO。

不,不可能通过处理元数据来合并(在Linux上)两个大文件

也许你可以考虑一些数据库来做你的工作。< /P> 正如Alexandre所注意到的,您可以将一个大文件附加到另一个文件,但这仍然需要大量的数据复制。

您可以这样做

cat file2 >> file1
文件1将成为完整内容。

您可以合并两个文件而不将一个文件写入另一个文件吗? 仅在模糊理论中。由于磁盘存储始终基于块,因此文件系统将内容存储在块边界上,如果第一个文件完全在块边界上结束,则只能将一个文件附加到另一个文件而无需重写。有一些罕见的文件系统配置,但只有当第一个文件已经使用前一个文件的尾部块时,这才有帮助

除非出现完美的场景,否则文件系统能够在文件中间标记一个部分块(我从来没有听说过),这是行不通的。为了解决边缘问题,除了更改内核交互之外,也没有其他方法可以进行这样的调用(re:)

我们能把这两个文件的大小都增加一倍吗? ,我们可以使用append(
>
)操作

cat file2 >> file1
这仍然会导致将
file2
占用的所有空间重复使用两次,直到我们可以删除它为止

我们能避免使用额外的空间吗? 。除非有人带着我不知道的东西回来,否则你在那里根本就不走运。有可能删除一个文件,忘记它的结尾,但是没有办法忘记开始的存在,除非我们返回到直接修改inode并且必须更改文件系统的内核接口,因为这绝对不是POSIX操作

一次写一点,然后删除我们写的东西怎么样? 再次拒绝。因为我们不能切掉文件的开头,所以我们必须重写从感兴趣点到文件结尾的所有内容。这将是非常昂贵的IO,只有在我们已经阅读了一半的文件后才有用

稀疏文件呢? 也许吧Sparse file允许我们存储一长串零,而不会占用太多空间。如果我们从末尾开始读取大块的
file2
,我们可以将这些块写入
file1
的末尾
file1
将立即看起来(和读取)就像它与两者大小相同一样,但在我们完成之前它将被损坏,因为我们没有编写的所有内容都将充满零

解释这一切本身就是另一个答案,但如果您可以进行备用分配,您将能够仅使用区块读取大小+磁盘空间中的一点额外空间来执行此操作。作为参考,讨论文件中间的稀疏块,参见或进行涉及术语的搜索,<代码> SekKyOrth
为什么这是“可能”而不是“是”?两部分:您必须编写自己的工具(至少我们在正确的站点上这样做了),而稀疏文件并没有得到文件系统和其他进程的普遍尊重。幸运的是,您可能不必担心与您的文件相关的其他进程,但您必须担心设置正确的标志并确保您的文件系统是可修改的。最后,您仍然需要读取和重新写入
文件2
的长度,这不是您想要的。这种方法确实意味着您可以附加少量的磁盘空间,而不是至少使用
2*file2
的空间量。

理论上的方法是更改文件系统中的映射(文件>块)。。。也许有些文件系统有这种功能?不,他们没有,如果文件长度不是文件系统块大小的倍数,你的解决方案就不起作用了。是的,我知道,每个块的每一个内容都需要改变以弥补这个差距。这值得更多的投票。找到解决这个问题的方法的人可能会发现“hungrycat”有用。hungrycat在标准输出上打印文件内容,同时释放文件占用的磁盘空间: