UNIX是否自动交换或替换目录?

问题描述 投票:2回答:2

我有以下问题。我有两个目录,分别称为dir1和dir2。它们都填充有文件和子目录。它们都在同一文件系统上。 dir1的内容较旧,必须替换为dir2的内容。 dir1的内容可以被丢弃。但是,我需要这种替换以原子方式进行。我当前的解决方案如下。

mv dir1 dir1_backup; mv dir2 dir1; rm -rf dir1_backup

如果第一条命令失败,第二条命令将不会运行。很好但是,如果第二条命令失败,该怎么办? dir1不再存在,我处于无效状态。

实现此目标的最佳方法是什么?有可能吗?

unix directory move atomic swap
2个回答
2
投票

我不认为如果第一个命令失败,那么您对第二条命令的主张将失败。如果mv dir1 dir1_backup失败,则dir1将仍然存在,并且mv dir2 dir1将使dir2成为dir1的子目录。另外,由于您在第三条命令中将-f传递给rm,因此它将无提示地删除不存在的目录。

供参考,三个bash运算符(此处为bash)及其作用:

  • ;无论退出状态如何,只需在第一个退出后执行以下命令即可。
  • &&&仅当前一个命令干净退出(即退出状态为0时,才执行以下命令。)>
  • ||仅当前一个命令异常退出(即退出代码为非零)时,才执行以下命令。
  • 如果您希望每个命令的执行都取决于前一个命令的成功执行,那么您可能需要考虑以下内容:

    mv dir1 dir1_backup && mv dir2 dir1 && rm -rf dir1_backup

如果目录移动是您期望的失败模式,那么在继续删除旧目录内容之前,测试移动的返回值或测试预期目录是否存在可能是合理的。如果测试失败,则将旧目录内容移回。整体操作将失败,但是至少您不会处于无效状态。例如:

    mv dir1 dir1_backup && \
    mv dir2 dir1 && \
    rm -rf dir1_backup || mv dir1_backup dir1

由于我们知道&&仅在前一个命令成功退出后才执行以下命令,因此mv dir2 dir1仅在mv dir1 dir1_backup成功后才执行。

此外,仅当dir2向dir1的移动成功时,才会执行rm -rf dir1_backup。但是,如果最后一个退出代码(如果失败则由mv dir2 dir1返回的代码)不为零,则||运算符会使mv dir1_backup dir1执行。

希望有帮助!让我知道是否需要澄清。

在Linux上,您可以通过绑定将新目录安装在旧目录之上而摆脱困境。但是,在旧目录内的目录(例如,其当前工作目录)上具有打开句柄的进程仍然会遇到问题。

类似的技巧将使您能够访问旧目录以进行清理。

[其他* nix具有相似的功能,但尚未标准化。


0
投票

在Linux上,您可以通过绑定将新目录安装在旧目录之上而摆脱困境。但是,在旧目录内的目录(例如,其当前工作目录)上具有打开句柄的进程仍然会遇到问题。

© www.soinside.com 2019 - 2024. All rights reserved.