合并文件夹时管理文件名冲突(linux)

合并文件夹时管理文件名冲突(linux)

我需要一种同步软件来执行文件夹的双向(递归)合并。

假设我有2个文件夹A和B。

文件夹 A 包含文件:1, 3, 5 and 7.
文件夹 B 包含文件:1, 2, 3 and 6.

合并执行后,结果应如下:

文件夹 A:1, 1-b, 2, 3, 3-b, 5, 6, 7
文件夹 B:1, 1-a, 2, 3, 3-a, 5, 6, 7


分别分解如下:

文件夹 A 和 B 都包含:(2, 5, 6, 7
非冲突文件名的 OR 并集:双向副本(同一级别,没有特定来源也没有任何特定目的地)无需重命名;

文件夹 A 还包含:(1, 1-b, 3, 3-b自己的版本加上添加的版本)
文件夹 B 还包含:(1, 1-a, 3, 3-a自己的版本加上添加的版本)
(破折号 a 或破折号 b 只是用于自动重命名以避免名称冲突的占位符,并不重要。每个后缀都可以)。基本上每个文件夹都会包含所有文件的所有版本(不会有较新的版本覆盖较旧的版本),无论它们的名称如何。

我如何才能得到这个结果?我查看了“meld”,但没有按预期工作(它建议覆盖现有文件,无法重命名),并且“rsync”似乎本质上是不对称的(赋予源比目标更高的排名)。我需要真正的泛化合并...

提前感谢任何帮助。顺便说一句... 专用的现有 SW 比手动重新发明热水更受欢迎。但如果没有,脚本也可以。谢谢。Gatto

答案1

查看info页面以了解普通的旧版本cp。类似这样的命令

cp --archive --backup --suffix="-original" A/* B

应该将每个文件从 A 复制到 B,并且如果存在任何已经存在的文件(冲突的文件名),则现有目标文件将被重命名[name]-original(即,首先进行备份)。

--no-clobber然后再次使用而不是运行它--backup,应该--suffix将 B 中剩余的任何文件复制到 A 中

cp --archive --no-clobber --exclude='*-original' B/* A

这应该排除[name]-originalB 中的文件。确保没有任何带有该后缀的文件。

并添加一个-v来查看发生了什么。

[尝试过 --recursive 但效果不如预期]

相关内容