我的理解是,这mv dir1/file1 dir2/
是原子的,
也是原子的吗mv dir1/* dir2/
?
举例来说,假设其中有 10 个文件,dir1
每个文件大小为 10GB。
答案1
mv
让我们从不总是原子的语句开始。
我们还要确定原子性是指文件内容,而不是文件名。
对于任何单个文件,只要文件在同一文件系统内移动, 执行的移动或重命名mv
都是原子的。原子性并不保证文件只在一个地方或另一个地方;文件很可能在“短时间内”同时出现在文件系统的两个地方。原子性保证的是,当提供时,文件内容可以立即完全可用,而不是部分可用。您可以想象,mv
在这种情况下,可以使用ln
后跟 来实现rm
。
mv
当执行的移动是从一个文件系统到另一个文件系统时,或者当远程文件系统无法mv
在本地实现操作时,它肯定不是原子的。在这些情况下,可以说它是由后跟的mv
等效项实现的。cp
rm
现在,讨论跨多个文件的原子性问题。mv
最多只能对每个文件进行原子操作,因此如果您要一起移动多个文件,则实现方式是一次移动一个文件。 如果您愿意,mv file1 dir; mv file2 dir; mv file3 dir
。
如果您确实需要一组文件同时出现在目标中,请考虑将它们放在一个目录中并移动该目录。这个单个对象(目录)可以自动移动。
答案2
号mv dir1/*
与 相同mv dir1/file1 && mv dir1/file2 && mv dir1/fileN
。每个单独的动作都是原子的,但不是完整的动作。
答案3
还有一种情况,mv启动后,向dir1中添加了新的文件。
由于“*”被 shell 扩展,mv 甚至不知道有新文件。