在Linux上,您可以通过绑定将新目录安装在旧目录之上而摆脱困境。但是,在旧目录内的目录(例如,其当前工作目录)上具有打开句柄的进程仍然会遇到问题。
我有以下问题。我有两个目录,分别称为dir1和dir2。它们都填充有文件和子目录。它们都在同一文件系统上。 dir1的内容较旧,必须替换为dir2的内容。 dir1的内容可以被丢弃。但是,我需要这种替换以原子方式进行。我当前的解决方案如下。
mv dir1 dir1_backup; mv dir2 dir1; rm -rf dir1_backup
如果第一条命令失败,第二条命令将不会运行。很好但是,如果第二条命令失败,该怎么办? dir1不再存在,我处于无效状态。
实现此目标的最佳方法是什么?有可能吗?
我不认为如果第一个命令失败,那么您对第二条命令的主张将失败。如果mv dir1 dir1_backup
失败,则dir1将仍然存在,并且mv dir2 dir1
将使dir2成为dir1的子目录。另外,由于您在第三条命令中将-f
传递给rm
,因此它将无提示地删除不存在的目录。
供参考,三个bash运算符(此处为bash)及其作用:
如果您希望每个命令的执行都取决于前一个命令的成功执行,那么您可能需要考虑以下内容:
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具有相似的功能,但尚未标准化。
在Linux上,您可以通过绑定将新目录安装在旧目录之上而摆脱困境。但是,在旧目录内的目录(例如,其当前工作目录)上具有打开句柄的进程仍然会遇到问题。