首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mv不能处理目标中存在的同名目录?

为什么mv不能处理目标中存在的同名目录?
EN

Unix & Linux用户
提问于 2016-03-25 21:17:45
回答 5查看 39.9K关注 0票数 11

mv无法将目录移动到具有同名目录的目标:

代码语言:javascript
复制
$ mv fortran/ imperative_PLs/
mv: cannot move ‘fortran/’ to ‘imperative_PLs/fortran’: Directory not empty
  1. 为什么mv在这种情况下不起作用?这可以通过系统调用mv来解释吗?(与rsync中的can相比)
  2. 为什么mv被设计成在这种情况下不能工作?理由或要点是什么?
EN

回答 5

Unix & Linux用户

回答已采纳

发布于 2016-03-25 21:35:32

  1. 在这种情况下,mv不能工作,因为它没有被设计为这样做。系统调用(可能)为之一。
    • 移到同一个文件系统:rename (最初是linkunlink)
    • 跨文件系统移动:递归文件复制,然后是递归unlink

  2. 意见:我认为它不是为了不工作而设计的,因为它不是为处理这个用例而设计的。对于一个“简单”工具,它的目的是很好地完成一件事情,您需要提供一组开关,以指示mv要采用哪些操作路径:
    • 避免错误,如在当前的实现中
    • 若要合并,如果文件已经存在,则使用错误进行转储。
    • 若要合并,请替换所有已存在的目标文件。

如果合并/替换操作是您想要的,那么您可以使用cprm,或者通过使用文件树复制实用程序tarpax等来实现它。

票数 7
EN

Unix & Linux用户

发布于 2016-03-25 21:35:50

mvrsync不是类似的程序。特别是,mv经常试图简单地重命名对象。如果它位于同一个文件系统中,则根本不复制内容。

如果您还没有imperative_PLs/fortran,那么mv将接受现有的fortran目录并将其重命名到树中的那个位置。

但是在那个位置已经有了一个目录(包含内容)。因为名称只能引用单个对象,所以必须删除或重命名现有目录。mv假设您不想这样做并中止操作。

相反,rsync会复制fortran中的各个文件和其他内容,并将它们放到现有的imperative_PLs/fortran目录中。

把它想象成rename,这样的行为可能会更容易理解。

票数 10
EN

Unix & Linux用户

发布于 2016-03-25 21:39:44

mv实际上是封面下的rename

如果将一个文件移动到另一个文件,则mv假定您知道正在做什么并覆盖目标文件。

如果将一个目录移动到另一个目录,mv假设您希望保留原始目录的basename,并在目标目录上创建它。如果目标端还没有具有该名称的目录,或者如果具有该名称的目录存在但为空,则操作将成功。

但是,如果目标目录已经存在且不为空,则这不再是一个rename,而是一个递归文件和目录删除。rename并不是为了做它而设计的,所以它失败了,mv没有更进一步,因为它假设您不想这样做,而且也失败了。

票数 7
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/272197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档