一尘不染

自动移动目录

linux

我在同一父目录中有两个目录。调用父目录 的基础* 和孩子目录 阿尔法喝彩 。我想用 bravo 代替 alpha
。最简单的方法是:
*

rm -rf alpha
mv bravo alpha

mv命令是原子的,但rm -rf不是。bash中有一种简单的方法可以用 bravo 原子替换 alpha 吗?如果没有,是否有复杂的方法?


附录:

顺便说一句,如果目录在短时间内不存在,这不是一个无法解决的问题。只有一个尝试访问alpha的地方,它会在执行任何关键操作之前检查alpha是否存在。如果不是,则会显示错误消息。但是,如果有一种方法可以做到这一点,那就太好了。:)也许有某种方法可以直接修改索引节点,或者其他方式。


阅读 236

收藏
2020-06-03

共1个答案

一尘不染

如果使用符号链接,则可以执行以下操作:

假设alpha是指向目录alpha_1的符号链接,而您想将符号链接切换为指向alpha_2。这是切换之前的样子:

$ ls -l
lrwxrwxrwx alpha -> alpha_1
drwxr-xr-x alpha_1
drwxr-xr-x alpha_2

要使alpha引用alpha_2,请使用ln -nsf:

$ ln -nsf alpha_2 alpha
$ ls -l
lrwxrwxrwx alpha -> alpha_2
drwxr-xr-x alpha_1
drwxr-xr-x alpha_2

现在您可以删除旧目录:

$ rm -rf alpha_1

请注意,这实际上不是完全原子的操作,但是由于“ ln”命令会同时取消链接然后立即重新创建符号链接,因此确实会很快发生。您可以使用strace验证此行为:

$ strace ln -nsf alpha_2 alpha
...
symlink("alpha_2", "alpha")             = -1 EEXIST (File exists)
unlink("alpha")                         = 0
symlink("alpha_2", "alpha")             = 0
...

您可以根据需要重复此过程:例如,当您有新版本alpha_3时:

$ ln -nsf alpha_3 alpha
$ rm -rf alpha_2
2020-06-03