【问题标题】:How to Ensure file copy integrity in Ubuntu如何在 Ubuntu 中确保文件复制的完整性
【发布时间】:2011-03-27 07:39:45
【问题描述】:

在 Ubuntu 中,如果文件 /A/largefile.foo 通过 'cp' 或 'mv' 移动到 /B/largefile.foo,我如何确保在尝试移动文件之前写入整个文件是时候到 /C/largefile.foo 了吗?

案例: 1. 远程自动化脚本 X 开始 rsync 到一个非常大文件的目标文件夹 A。 2.本地机器上的cron作业每小时将文件从文件夹A移动到文件夹B,但我不想复制部分文件(我只想要完全上传完成的文件)

案例: 1. 一个cron作业会定期将文件从文件夹B移动到文件夹C,但我不想复制部分文件(我只想要完全上传完成的文件)

注意: 我正在寻找不需要添加pid文件的解决方案

【问题讨论】:

    标签: linux ubuntu cp mv


    【解决方案1】:

    对于第一个rsync 情况,您可以使用--partial-dir 选项与--delay-updates 结合使用,它将部分文件写入单独的位置,完成后将它们重命名到位。

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

    对于第二种情况,使用mv(再次假设一个文件系统)这将是原子的。

    查看rsync manual了解更多信息

    【讨论】:

    • 谢谢,这正是我想要的!
    【解决方案2】:

    一种常见的方法是复制带有“.part”后缀的文件。复制完成后,脚本会重命名文件以删除 .part。您的其他脚本只需忽略 .part 文件。

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

    【讨论】:

      【解决方案3】:

      使用 rsync。您还可以 md5sum 原始文件和目标上的新文件(如果是 cp)

      【讨论】:

        【解决方案4】:

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

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

        解决方案是先写入临时文件,然后将其移动到目的地。 rsync 的选项 --delay-updates 使它完全做到这一点。

        【讨论】:

          猜你喜欢
          • 2016-04-06
          • 2015-03-01
          • 2021-10-05
          • 1970-01-01
          • 2015-04-05
          • 2019-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多