mv a b
cp a b
;rm a
这是两组语句。它们的作用有什么不同吗?
答案1
假设所涉及的文件位于同一文件系统上,则 mv 只是更改文件系统中的指针,而 cp 会复制文件的所有内容,rm 再次更改指针。因此 mv 效率更高。
答案2
是的,mv 有机会在同一个磁盘上成为原子,而 cp 和 rm 的组合永远不可能。
这是假设 mv 是使用 实现的rename()
,这是具有保证的调用。例如,此新闻组帖子,其中引用了 POSIX:
对于常规文件,此 rename() 函数相当于 ISO C 标准定义的函数。此处包含该函数扩展了该定义以包括对目录的操作,并指定了新参数命名已存在的文件时的行为。该规范要求该函数的操作是原子的。
答案3
在同一个文件系统上,mv 改变目录引用,指向同一个 inode(文件数据和元数据),因此:
- 是原子操作(不能被另一个进程文件操作打断)
- 仅占用少量的额外磁盘空间(目录中的附加名称)
- 保留文件权限和所有权
- 速度会更快,具体取决于数据量
复制并删除
- 不是原子的(另一个进程可能会干扰 cp 和 rm 命令)
- 需要在磁盘上短时间内存储文件数据两次(在 cp 和 rm 命令之间)
- 将文件权限和所有权更改为默认值
- 根据数据量,可能会慢很多甚至失败
答案4
动量本质上是“重命名”操作。这意味着文件本身仍留在磁盘上的同一位置。不执行任何实际的文件操作。