6

我有一个 bash 脚本(Scientific Linux)。该脚本必须对文件进行操作。假设“file.dat”(大约 1 GB 大小)一段时间后,脚本重新启动并执行以下操作:

if [ -f file.dat ];  then
    cp file.dat file.previous.dat
fi

备份文件。然后一个进程启动并覆盖“file.dat”

为了安全起见(断电或任何意外情况)。最好的选择是什么: cp 或 mv ?谢谢。

4

3 回答 3

5

我会使用一个组合:

mv file.dat file.dat.previous
cp file.dat.previous file.dat

这种方式file.dat.previous将永远是完整的,就像mv原子一样。

于 2012-06-27T16:49:02.373 回答
4

错误问题的正确答案

如果你想要一个快速的原子动作,那么mv就是要做的事情,因为它man 2 rename说:

如果 newpath 已经存在,它将被原子地替换(受一些条件的影响;请参阅下面的错误),以便尝试访问 newpath 的另一个进程不会发现它丢失。

或许更重要的是,mv很大程度上是一个目录入口操作,因此在任何正常情况下,它都比文件复制快得多。

正确问题的正确答案

如果您担心停电或系统意外关闭,那么:

  1. 连接不间断电源。真的。求解威胁模型。
  2. 确保您使用的是电池供电的 RAID 控制器。
  3. 使关键写入同步。
  4. 使用日志文件系统来记录数据,而不仅仅是元数据。

mv命令应该更快,但面对灾难性故障时的稳健性是硬件或文件系统问题。

于 2012-06-28T06:49:37.850 回答
1

在这里可能没有太大帮助,但rsync它是这种工作的工具。如果传输被中断,它可以从它需要去的地方重新启动。

于 2012-06-27T18:49:38.370 回答