如何确保Ubuntu中的文件副本完整性

时间:2010-08-09 13:48:25

标签: linux ubuntu cp mv

在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文件的解决方案

4 个答案:

答案 0 :(得分:4)

对于第一个rsync案例,您可以使用--partial-dir选项与--delay-updates结合使用,它会将部分文件写入单独的位置,一旦完成就将其重命名为位置。

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

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

有关详细信息,请参阅rsync manual

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

如果您打开文件然后从文件系统中删除它,您仍然可以写入该文件。这就是我们在旋转日志之后需要告诉syslogd重新打开文件句柄的原因。

解决方案是首先写入临时文件,然后将其移动到目标。 rsync的选项--delay-updates使其完成此操作。