仅在目标不存在的情况下重命名/移动文件

我想知道是否有任何方法可以移动文件只有当目的地不存在 – 换句话说,只有当它不会导致覆盖移动。

mv --update 

似乎首先是解决scheme,但是,如果源path的时间戳比目标更新,则移动将覆盖它,并且所有尝试通过在移动失败之前修改时间戳来规避此问题。

我需要这种行为来实现一个简单的基于文件的锁,其中“锁”文件的存在表示获取锁。

你可以使用rsync和--ignore-existing开关:

  skip updating files that exist on receiver 

但是,我认为这不是primefaces的。 您可以使用flock创build咨询锁,以确保您控制的进程(协作进程)不会写入该进程。 但另一个过程仍然可以。

locking文件的唯一方法是避免另一个进程搞乱文件,而是使用强制locking来挂载文件系统。 从<linux_kernel_source>/Documentation/filesystems/mandatory-locking.txt / <linux_kernel_source>/Documentation/filesystems/mandatory-locking.txt

什么是强制locking?

强制locking是内核强制执行的文件locking,而不是用于保证在进程之间顺序访问文件的更常用的协作式文件locking。 使用flock()和fcntl()系统调用(和fcntl()函数中的lockf()库例程来应用文件锁。)通常是一个进程负责检查它希望的文件上的锁更新,然后再应用自己的锁,更新文件并再次解锁。 这个最常用的例子(在sendmail中,最麻烦的是)访问用户的邮箱。 邮件用户代理和邮件传输代理必须防止同时更新邮箱,并防止在更新邮箱时阅读邮箱。

在一个完美的世界里,所有的stream程都会使用和尊重一个合作的或“咨询”的lockingscheme。 然而,这个世界并不完美,而且有很多写得不好的代码。

如果你在同一个文件系统上,使用link()unlink()来代替mv

 $ touch src $ ln src dest && rm src $ ls dest $ touch src2 $ ln src2 dest && rm src2 ln: creating hard link `dest': File exists $ ls dest src2 

从公开(2)手册页:

可移植的程序,想要使用锁文件执行primefaces文件locking,并且需要避免依赖NFS对O_EXCL的支持,可以在同一文件系统(例如,包含主机名和PID)上创build一个唯一的文件,并使用link(2)创build一个锁文件的链接。 如果链接(2)返回0,则locking成功。 否则,在唯一文件上使用stat(2)来检查它的链接数是否增加到2,在这种情况下,锁也是成功的。