Linux 在不破坏现有目录的情况下移动目录

Linux 在不破坏现有目录的情况下移动目录,linux,unix,directory,filesystems,posix,Linux,Unix,Directory,Filesystems,Posix,单一UNIX规范中的描述是,如果现有目录为空且old也是一个目录,则rename(old,new)将覆盖该目录 我试图找到一种方法来重命名目录,同时确保使用新名称的现有目录永远不会被覆盖(如果两个并发进程尝试将目录重命名为相同的新名称,则可能会发生这种情况)。检查目录是否存在 # before rename, check if file exist if [ -d new ] then # here do what you like if dir exist. else #dir does n

单一UNIX规范中的描述是,如果现有目录为空且
old
也是一个目录,则
rename(old,new)
将覆盖该目录


我试图找到一种方法来重命名目录,同时确保使用新名称的现有目录永远不会被覆盖(如果两个并发进程尝试将目录重命名为相同的新名称,则可能会发生这种情况)。

检查目录是否存在

# before rename, check if file exist
if [ -d new ]
then
# here do what you like if dir exist. 
else
#dir does not exist so rename
    rename(old, new)
fi

您需要使用某种形式的同步机制-请参阅有关锁的一些基本信息,例如


该函数将自动创建一个新链接,该链接可帮助您创建锁定文件。原子性将确保更多并发进程无法创建相同的锁文件。

您可以尝试使用原子性的
链接,如果目标存在,该链接将失败。比如:

if (link("orig", "dest")) unlink("orig");

应该有用<如果
dest
未退出,则code>link
将自动成功,因此要完成
重命名
,只需取消
orig
的链接即可。如果
dest
存在,`link将失败。

遗憾的是,这只在只有一个进程同时运行的情况下才有效。我开始认为,在POSIX API中,这实际上是不可能的,除非有某种
锁定
目录的方法。我也会接受一个带有合理解释的答案,说明这是不可能的。对于文件,这是一个我还没有想到的想法!但不幸的是,我的用例涉及到原始文件和目标文件作为目录。如果您有适当的权限,您可以链接目录(正如POSIX.1所说)。它在过去尝试过,并且成功了,当然,您应该小心不要在文件系统上创建循环路径。AFAIK OS X是唯一广泛使用的POSIX OS,它允许多个目录链接,不包括
条目。Linux当然不是,它过去在大多数Unix上得到了广泛的支持(有特权)。我想现在Linux文件系统禁止它了。但这是非常有用的,苹果的时间机器大量使用它。。。