linux – 以原子方式移动目录 - 代码日志

linux – 以原子方式移动目录

我在同一个父目录中有两个目录。调用父目录库和子目录的alpha和bravo。我想用bravo替换alpha。最简单的方法是:

rm -rf alpha
mv bravo alpha

mv命令是原子的,但是rm -rf不是。在bash中有一个简单的方法来原子替换alpha与bravo?如果没有,是否有复杂的方式?

附录:

通过这个,如果目录在短时间内不存在,这不是一个不可克服的问题。只有一个地方试图访问alpha,它会检查alpha是否存在,然后再做任何关键的事情。如果没有,它会给出错误消息。但是如果有办法做到这一点会很好。 :)也许有一些方法直接修改inode,或某事…

如果使用符号链接,可以这样做:

假设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
http://stackoverflow.com/questions/307437/moving-a-directory-atomically

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:linux – 以原子方式移动目录