在Unix上,mv和{cp + rm the old file}有什么区别吗?


13
  • mv a b

  • cp a b;rm a

这是两组语句。他们的工作之间有区别吗?


1
原子性?我真的不知道mv命令是否是原子的。
阿德里亚诺·瓦罗利广场

是。你为什么要问?

1
现在,mv它类似于ln+ rm,但是,前者将适用于跨文件系统移动(然后变为cp+ rm),而后者将失败ln(不支持跨文件系统硬链接)。
克里斯·杰斯特·杨

每天都是上学日-对于任何想知道如何覆盖此默认行为的人,您都需要进行--remove-destination切换 -stackoverflow.com/a/9371263/409638
robert 2016年

Answers:


20

假设所涉及的文件在同一文件系统上,则mv只需更改文件系统中的指针,而cp复制文件的全部内容,而rm再次更改指针。因此,MV效率更高。


但是他们做的完全一样,对吧?
拉泽尔

8
不,他们没有。

2
@eSKay:否。两种情况:1.目标不存在。mv只是重命名文件(与原始文件相同的inode)。cp为新文件创建新的索引节点。2.目标确实存在。mv第一步,取消链接(删除)目标文件并重命名。cp覆盖目标文件的索引节点。
克里斯·杰斯特·杨

7
mv永远不要更改权限或所有权。假设您要将文件从好友的homedir移到自己的homedir。如果是mv这样,您最终会在homedir中找到一个属于您的好友的文件。您不能chownchmod根据权限甚至不能修改或读取它。如果您这样做cprm那么文件将属于您,一切都很好。
路德维希·魏尼尔

9

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

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

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


8

在同一文件系统上,mv更改目录引用,指向同一索引节点(文件数据和元数据),因此:

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

复制并删除

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

4

当源和目标位于相同的物理卷上时,第一种方法就是重命名,并且速度非常快(即使文件很大)。

cprm将始终必须加载/存储所有数据,即使不是必需的。


3

mv本质上是“重命名”操作。这意味着文件本身留在磁盘上的同一位置。没有执行实际的文件操作。


3

区别在于mv保留文件属性,而cp默认情况下不保存,例如将creation-date设置为当前日期。

要覆盖此默认值,请使用“ cp -p”保留上次数据修改,上次访问时间,用户ID和组ID(仅在具有此权限的情况下),文件许可权位以及SUID和SGID位。


2

是。

mv只需更改文件名称和位置相关的文件系统元数据,而cp创建文件的单独副本,这需要更长的时间,因为它必须完全读取第一个文件,然后将其内容写入另一个文件


2

cp和rm占用大量磁盘空间,并且可能由于磁盘空间原因而失败。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.