如果在复制文件时修改了文件,该怎么办?


19

将文件A.big(900mb)从位置B复制到位置C有什么作用。如果在该cp操作期间,例如说完成了35%,则fileA.big会附加新信息,并且从900mb增长到930mb。

最终副本(即locationC处的fileA.big)的结果是什么?

如果复制完成了大约70%,并且原始文件已更新,但是这次被截断为400mb(即,复制进度超出了截断点),怎么办?最终复制的结果是什么?

指的是ext3 / ext4文件系统上的linux操作系统。没有卷影魔术等。只是普通的老cp。出于好奇,是通过复制活动的ouchdb数据库文件进行备份而引起的,但对通用方案而不是特定用例更感兴趣。


感谢您提出这一问题。直到现在,我的“知识”大部分还是个猜测。
tshepang 2011年

Answers:


10

如果fileA.big在复制过程中增长,副本将包含附加的数据。

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


27

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

  1. 尝试从中读取一些(更多)字节fileA
  2. 如果由于在文件末尾(或超过文件末尾)而无法获取字节,那么我们就完成了;放弃。
  3. 否则,将字节写入fileB并循环回到步骤1。

知道了这一点并如此简单,就让我们看到了一些极端的情况。

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

如果文件被截断,则复制程序将显示“哇,我已经超过文件末尾了!” 并退出。

而且,如果文件片段是通过数据库程序:-)随机更新的,则您的副本将是新旧数据的某种混合,因为这些数据不是同时复制的。结果很可能是损坏的副本,这就是为什么制作实时数据库副本通常不是一个好主意的原因。

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


很好的解释。顺便说一句,这总是让我感到惊讶的是,为什么在类似UNIX的操作系统下却可以从Windows中获得典型的错误消息(“无法访问文件-使用中的文件”),您甚至无法播放已经删除的MP3文件播放时。在Unix下,您可以(令人惊讶地)-完全没有问题。我猜想基于UNIX的OS总是可以处理文件的备份副本,因此这是可行的。
语法错误

1
实际上,能够读取已删除的文件来自另一种UNIX功能:在UNIX下,文件和文件名是不同的东西。删除文件时,实际上是在删除到该文件的名为“链接”的链接。程序打开文件时,该文件也算作链接。系统仅在没有链接时才删除文件本身。
詹德(Jander)2013年

因此,如果文件增长得快于我们可以复制的速度,cp将永远不会终止?我意识到这是不可能的,因为无论对文件的任何写入都必须能够对文件进行写入,其速度比cp可以读取文件的速度还要快。
布拉德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.