如果我用来mv
将名为“folder”的文件夹移动到已包含“folder”的目录,它们会合并还是会被替换?
答案1
mv
无法合并或覆盖目录,它将失败并显示消息“mv:无法将‘a’移动到‘b’:目录不为空”,即使您正在使用该--force
选项。
您可以使用其他工具(例如rsync
、find
,甚至cp
)来解决此问题,但您需要仔细考虑其影响:
rsync
可以将一个目录的内容合并到另一个目录中(理想情况下使用--remove-source-files
1选项仅安全删除那些已成功传输的源文件,-a
如果您愿意,还可以使用通常的权限/所有权/时间保存选项)
...但这是一个完整的复制操作,因此可能非常占用磁盘空间。- 您可以使用
find
按顺序在目标上重新创建源目录结构,然后单独移动实际文件
......但这必须在源中多次递归,并且可能会遇到竞争条件(在多步骤过程中在源中创建新目录) cp
可以创建硬链接(简单地说,指向同一现有文件的附加指针),这会创建与合并非常相似的结果mv
(并且 IO 效率非常高,因为仅创建指针而无需复制实际数据)
...但这再次遭受可能的竞争条件(源中的新文件被删除,即使它们没有在上一步中复制)您可以组合(注意:从 rsync 开始这将不再起作用版本3.2.6)rsync
的--link-dest=DIR
选项(在可能的情况下创建硬链接而不是复制文件内容)并--remove-source-files
获得与常规mv
.
为此,--link-dest
需要给出一个绝对路径来源目录(或相对路径目的地到来源)。
……但这是以--link-dest
一种意想不到的方式使用(可能会或可能不会导致复杂性),需要知道(或确定)源的绝对路径(作为 的参数),并再次留下一个空目录结构以按照1--link-dest
进行清理。
这些解决方法中哪一个(如果有)合适将在很大程度上取决于您的具体用例。
与往常一样,在执行任何这些命令之前请三思并做好备份。
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/{}'