在 Unix 上,mv 和 {cp + rm 旧文件} 之间有什么区别?

在 Unix 上,mv 和 {cp + rm 旧文件} 之间有什么区别?
  • mv a b

  • cp a brm a

这是两组语句。它们的作用有什么不同吗?

答案1

假设所涉及的文件位于同一文件系统上,则 mv 只是更改文件系统中的指针,而 cp 会复制文件的所有内容,rm 再次更改指针。因此 mv 效率更高。

答案2

是的,mv 有机会在同一个磁盘上成为原子,而 cp 和 rm 的组合永远不可能。

这是假设 mv 是使用 实现的rename(),这是具有保证的调用。例如,此新闻组帖子,其中引用了 POSIX:

对于常规文件,此 rename() 函数相当于 ISO C 标准定义的函数。此处包含该函数扩展了该定义以包括对目录的操作,并指定了新参数命名已存在的文件时的行为。该规范要求该函数的操作是原子的。

答案3

在同一个文件系统上,mv 改变目录引用,指向同一个 inode(文件数据和元数据),因此:

  • 是原子操作(不能被另一个进程文件操作打断)
  • 仅占用少量的额外磁盘空间(目录中的附加名称)
  • 保留文件权限和所有权
  • 速度会更快,具体取决于数据量

复制并删除

  • 不是原子的(另一个进程可能会干扰 cp 和 rm 命令)
  • 需要在磁盘上短时间内存储文件数据两次(在 cp 和 rm 命令之间)
  • 将文件权限和所有权更改为默认值
  • 根据数据量,可能会慢很多甚至失败

答案4

动量本质上是“重命名”操作。这意味着文件本身仍留在磁盘上的同一位置。不执行任何实际的文件操作。

相关内容