用 mv 合并文件夹?

用 mv 合并文件夹?

如果我用来mv将名为“folder”的文件夹移动到已包含“folder”的目录,它们会合并还是会被替换?

答案1

mv无法合并或覆盖目录,它将失败并显示消息“mv:无法将‘a’移动到‘b’:目录不为空”,即使您正在使用该--force选项。


您可以使用其他工具(例如rsyncfind,甚至cp)来解决此问题,但您需要仔细考虑其影响:

  • rsync可以将一个目录的内容合并到另一个目录中(理想情况下使用--remove-source-files1选项仅安全删除那些已成功传输的源文件,-a如果您愿意,还可以使用通常的权限/所有权/时间保存选项)
    ...这是一个完整的复制操作,因此可能非常占用磁盘空间。
  • 您可以使用find按顺序在目标上重新创建源目录结构,然后单独移动实际文件
    ......这必须在源中多​​次递归,并且可能会遇到竞争条件(在多步骤过程中在源中创建新目录)
  • cp可以创建硬链接(简单地说,指向同一现有文件的附加指针),这会创建与合并非常相似的结果mv(并且 IO 效率非常高,因为仅创建指针而无需复制实际数据)
    ...这再次遭受可能的竞争条件(源中的新文件被删除,即使它们没有在上一步中复制)
  • 您可以组合rsync--link-dest=DIR选项(在可能的情况下创建硬链接而不是复制文件内容)并--remove-source-files获得与常规mv.
    为此,--link-dest需要给出一个绝对路径来源目录(或相对路径目的地来源)。
    ……这是以--link-dest一种意想不到的方式使用(可能会或可能不会导致复杂性),需要知道(或确定)源的绝对路径(作为 的参数),并再次留下一个空目录结构以按照1--link-dest进行清理。
    (注意:从 rsync 开始这将不再起作用版本3.2.6

这些解决方法中哪一个(如果有)合适将在很大程度上取决于您的具体用例。
与往常一样,在执行任何这些命令之前请三思并做好备份。


1:请注意,rsync --remove-source-files不会删除任何目录,因此您必须执行类似find -depth -type d -empty -delete之后的操作才能删除空的源目录树。

答案2

rsync -av /source/ /destination/
(after checking)
rm -rf /source/

答案3

您可以使用-l以下选项CP命令,它创建硬链接同一文件系统上的文件而不是完整数据副本。以下命令将该文件夹复制source/folder到父文件夹 ( destination),该文件夹已包含具有该名称的目录folder

cp -rl source/folder destination
rm -r source/folder

您可能还想使用-P( --no-dereference- 不要取消引用符号链接) 或-a( --archive- 保留所有元数据,还包括-P选项),具体取决于您的需要。

答案4

这是合并目录的方法。它比 rsync 快得多,因为它只是重命名文件而不是复制它们然后删除它们。

cd source; find -type f -print0 | xargs -0 -n 1 -I {} mv '{}' 'dest/{}'

相关内容