代码之家  ›  专栏  ›  技术社区  ›  Lance Caraccioli

如何确保Ubuntu中文件拷贝的完整性

  •  1
  • Lance Caraccioli  · 技术社区  · 16 年前

    在Ubuntu中如果一个文件/a/largefile.foo 通过“cp”或“mv”移动到/B/largefile.foo,如何确保在尝试将文件再次移动到/C之前写入整个文件/largefile.foo?

    案例: 1远程自动脚本X开始rsync到一个非常大的文件的目标文件夹。

    案例:

    注:

    4 回复  |  直到 16 年前
        1
  •  4
  •   Hasturkun    16 年前

    第一次 rsync 你可以用 --partial-dir 选项与 --delay-updates ,它将部分文件写入一个单独的位置,完成后将其重命名到位。

    您应该确保部分目录与目标目录位于同一个文件系统上,因此重命名将是原子的。

    mv (同样假设只有一个文件系统)这将是原子的。

    看到了吗 rsync manual 了解更多信息

        2
  •  1
  •   Eric Darchis    16 年前

    一种常见的方法是复制后缀为“.part”的文件。复制完成后,脚本将重命名文件以删除.part。您的另一个脚本只需忽略.part文件。

    这就是下载管理器、FTP程序等正在做的事情。

        3
  •  1
  •   Joshua D. Drake    16 年前

        4
  •  0
  •   sanmai    16 年前

    移动操作在一个文件系统中的POSIX上是原子的。

    如果打开一个文件,然后将其从文件系统中删除,仍然可以写入该文件。这就是为什么我们需要告诉syslogd在循环日志之后重新打开文件句柄。

    解决方案是先写入临时文件,然后将其移动到目标位置。 --delay-updates 因为rsync让它做到了这一点。