对于这个问题中的所有内容,假设系统只有一个磁盘和文件系统。(我们不会写入不同的分区、磁盘或文件系统)
我正在处理一个将cat非常大的 .MTS 文件转换为一个巨大的 .MTS 文件的项目。这需要读取每个小文件并将它们写入一个新的大文件,然后删除小文件。对于这么大的文件,这需要很长时间。
我的理解-cp比mv因为cp读取文件并将其写入磁盘上的不同位置需要更长的时间。mv另一方面不复制或移动文件。mv删除对文件的引用并在新位置创建一个新文件。例如,mv /tmp/foo /tmp/bar将文件原样保留在磁盘上,并删除指向/tmp/foo磁盘上文件的引用,并添加指向/tmp/bar磁盘上文件的新引用。
问题:
cat就像cp是因为它将文件复制到新位置。有了这么大的文件,完成后不需要较小的文件,是否有类似的东西而不是cat使用?mvcp
理论(我可能错了)
文件分散存储在驱动器周围已经很常见。例如,一个 2GB 的文件可能有几个较小的块存储在驱动器的不同部分。这样,当 5K 文件被删除时,它可以被 20MB 文件的一部分覆盖。如果我们将 2GB 的文件留在原处,只引用所有部分,似乎我们可以cat foo/* >> bar/bigfile.MTS; rm foo/*在很短的时间内产生相同的效果。
如果没有任何东西可以做到这一点并且这是一个坏主意,谁能给我举个例子说明为什么?鼓励用分散的文件块弄乱磁盘是不是很糟糕?
像这样的工具存在的最大障碍是,除非连接的每个文件的大小(最后一个除外)可以被块大小完全整除(我对这里的正确术语有点不确定),否则你最终会得到最终文件中的连接文件之间的垃圾数据“差距”。
这是因为文件数据通常存储在文件系统上具有特定大小的块中,因此存储在使用 32 字节块的文件系统上的 618 字节文件将占用 618 / 32 = 19.3125 个块,即 19 个完整块,大约1/3 的附加块。
假设您想像这样组合两个文件而不考虑我的障碍,您只需将“新文件”指向第一个文件的块,加上第二个文件的块,对吗?
使用这种简单的方法,您最终会得到一个包含 40 个块的文件,其中第 20 个块是 1/3 合理和 2/3 垃圾,第 21 块开始第二个文件的数据。
对于某些文件格式,您可能能够对文件头进行一些巧妙的计算和操作,以基本上告诉将使用该文件的应用程序跳过垃圾部分,但这更像是一种创可贴的解决方案,而不是正确的解决方案。