我想知道是否有任何方法可以移动文件只有当目的地不存在 – 换句话说,只有当它不会导致覆盖移动。
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,在这种情况下,锁也是成功的。