Unix 上的 mv 和 {cp + rm the old file} 之间有什么区别吗?

Laz*_*zer 14 unix

  • mv a b

  • cp a b;rm a

这是两组陈述。他们所做的事情有什么不同吗?

小智 20

假设涉及的文件在同一个文件系统上,那么 mv 只是简单地改变文件系统中的指针,而 cp 复制文件的全部内容,而 rm 再次改变指针。所以 mv 效率更高。

  • 不,他们没有。 (8认同)
  • 此外`mv` 永远不会改变权限或所有权。想象一下,您想将一个文件从您好友的 homedir 移动到您自己的 homedir。如果你`mv`它,你最终会在你的homedir中得到一个属于你伙伴的文件。你不能`chown` 或`chmod` 并且根据权限甚至不能修改或读取它。如果你先做 `cp` 后跟 `rm`,这个文件就属于你,一切都很好。 (8认同)
  • @eSKay:不会。两种情况:1.目标不存在。`mv` 只是重命名文件(与原始文件相同的 inode)。`cp` 为新文件创建一个新的 inode。2.目标确实存在。`mv` 一步解除(删除)目标文件的链接,并重命名。`cp` 覆盖目标文件的 inode。 (3认同)

unw*_*ind 9

是的, mv 有可能在同一个磁盘上是原子的,而 cp 和 rm 的组合从来没有。

这是假设 mv 是使用 实现的rename(),这是有保证的调用。例如,请参阅这个引用 POSIX 的新闻组帖子

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


mpe*_*ez0 8

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

  • 是原子操作(不能被另一个进程文件操作中断)
  • 只需要少量的额外磁盘空间(目录中的额外名称)
  • 保留文件权限和所有权
  • 可以更快,具体取决于数据量

复制并删除

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