我有朋友电脑的 2 个非常旧的备份。它们只是被复制到外部硬盘驱动器上的每个文件夹中。两者的大小约为 300GB,内容非常相似但不完全相同,并且文件夹结构也不同。我想释放该空间并为这两个空间制作一个备份。我认为大约 90% 的文件都是重复的,但我不想错过不重复的文件。
所以我需要一个程序来比较两个目录中的文件及其所有子目录,但忽略这些子目录。文件夹 A 中的所有文件应与文件夹 B 中的所有文件进行比较。文件夹 B 中的所有重复项均应标记/移动(/删除)。我将手动处理文件夹 B 中的剩余部分。
我尝试过 meld,我尝试过 Gnome-Commander(我将 Xubuntu 与 XFCE 一起使用)
我会喜欢 gui 解决方案,但我也应该能够处理终端和脚本。我认为可能可以为双方构建一个文件列表并将它们通过管道传输到某些差异程序,但如何准确地做到这一点超出了我的能力。
好吧,期待你的答案,龟紫
答案1
如果目标是保留文件内容(避免丢失数据),我会专注于文件相等性,而不是文件目录的命名。
首先在每个顶级文件夹上运行此命令,然后保存输出(它将运行一段时间!)。
find FolderA -type f -print0 | xargs -0 cksum > FoldA.cksum
find FolderB -type f -print0 | xargs -0 cksum > FoldB.cksum
将两个输出排序在一起,从而将所有相同的文件内容放在一起。然后开始编写 awk 以根据前两个字段(校验和和大小)对相同的内容进行分组。
(a) 任何单行组都是要保存的唯一文件。
(b) 任何更大的组都是相同文件的列表。不妨保留最上面的一个,并将其他名称写入列表以进行删除(这些名称可能在 A 和 B 之间、或在 A 内、或在 B 内,或两者之间重复。
现在,所有重复文件将仅位于您的“FolderA”名称中,大约一半的唯一文件也将位于您的“FolderA”名称中。您如何处理所选副本来自FolderB 的文件(假设您需要合并剩余内容)?
如果它们的路径名(从FolderB之后到最低目录)存在于FolderA中,那么您可能需要通过另一个输出列表将它们移动到那里。
如果它们在FolderA 中的路径名不存在,您就会猜测它们真正属于哪里。您可以创建适当的目录(及其所有父目录)并冒着丢失它的风险,或者观察它以查看它是否与其他任何地方相对应。
最后这两个步骤都需要额外检查:您是否有两个(或更多)具有相同名称的不同文件的可能性。在这种情况下,您需要选择某种解决方案(例如始终保留更高版本),或扩展文件名以使其唯一,或单独检查每个案例。
我的方法是逐步进行此工作:首先处理精确的重复文件(您估计为 90%),然后评估可用于协调其余部分的任何模式的差异。
答案2
做一些简单的事情,例如将一个目录复制到另一个目录并忽略/替换相同的(按路径)文件。如果这会产生一些重复项(不同的路径,相同的文件名),您可以稍后尝试找到它们。
想要“gui”解决方案吗?使用MC。当被问及如何处理重复项时,您可以选择“更新”或“如果大小不同”。
或者使用诸如 zip/7z/rar/tar 之类的存档器将 dir1 打包到存档中并使用 dir2 进行更新。这将避免重复,并且您将获得一份更新的备份。
附言。
recursively ignoring sub-directories
是矛盾的。你能解释一下吗,因为这还不清楚。