如果在复制文件时修改了文件,会发生什么情况?

Mât*_*man 23 cp file-copy

将文件 fileA.big (900mb) 从位置 B 复制到位置 C 有什么影响,如果在该 cp 操作期间,例如通过该过程的 35%,fileA.big 附加了新信息并从 900MB 增长到 930MB?

最终副本的结果是什么(即位置 C 的 fileA.big)?

如果副本通过了大约70%,并且原始文件被更新但这次被截断为400MB(即副本的进度超出了截断点),那么最终副本的结果是什么?

指 ext3/ext4 文件系统上的 Linux 操作系统。没有卷影魔法等。只是普通的老cp。通过复制实时 CouchDB 文件进行备份激发了好奇心,但对一般场景而不是特定用例更感兴趣。

Jan*_*der 31

帕特里克或多或少是正确的,但这就是原因。在 UNIX 下复制文件的方式如下:

  1. 尝试从fileA.
  2. 如果我们因为到达(或超过)文件末尾而未能获取字节,我们就完成了;退出。
  3. 否则,将字节写入fileB并循环回到步骤 1。

知道这一点,并知道它就这么简单,让我们看到一些极端情况。

一旦我们找到文件的结尾,复制就完成了。因此,假设我们的文件在复制期间增长,但增长速度比我们复制它的速度要慢。复制程序将继续超过原始文件大小,因为当它到达那里时,文件中有更多内容。但在某些时候,它赶上了文件的末尾,它知道它是在最后,因为它无法读取更多的数据,现在。所以它就在那里退出,即使文件将进一步增长。

如果文件被截断,复制程序会说“哇,我已经超过了文件的结尾!” 并退出。

如果文件的各个部分被某个数据库程序随机更新:-),那么您的副本将是新旧数据的某种混合,因为数据不是同时复制的。结果可能是一个损坏的副本,这就是为什么制作实时数据库的副本通常不是一个好主意。

(也就是说,我不熟悉 CouchDB,并且可以设计一个数据库来抵抗这种损坏。但最好绝对确定。)

  • 实际上,能够读取已删除的文件来自于不同的 UNIX 功能:在 UNIX 下,文件和文件名是不同的东西。当您删除文件时,您真正要做的是删除该文件的命名“链接”。当程序打开文件时,该文件也算作链接。仅当文件没有留下任何链接时,系统才会删除该文件本身。 (2认同)

phe*_*mer 12

如果fileA.big在复制期间增长,则副本将包括附加的数据。

如果文件被截断的时间短于副本当前所在的位置,则副本将在其所在的位置中止,并且目标文件将包含在中止之前复制的内容。