带通配符的 mv 是否仍然是原子的

带通配符的 mv 是否仍然是原子的

我的理解是,这mv dir1/file1 dir2/是原子的,

也是原子的吗mv dir1/* dir2/

举例来说,假设其中有 10 个文件,dir1每个文件大小为 10GB。

答案1

mv让我们从不总是原子的语句开始。

我们还要确定原子性是指文件内容,而不是文件名。

对于任何单个文件,只要文件在同一文件系统内移动, 执行的移动或重命名mv都是原子的。原子性并不保证文件只在一个地方或另一个地方;文件很可能在“短时间内”同时出现在文件系统的两个地方。原子性保证的是,当提供时,文件内容可以立即完全可用,而不是部分可用。您可以想象,mv在这种情况下,可以使用ln后跟 来实现rm

mv当执行的移动是从一个文件系统到另一个文件系统时,或者当远程文件系统无法mv在本地实现操作时,它肯定不是原子的。在这些情况下,可以说它是由后跟的mv等效项实现的。cprm

现在,讨论跨多个文件的原子性问题。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 甚至不知道有新文件。

相关内容