比较两个目录树

比较两个目录树

我有两个音乐库,一个比另一个更新。我想比较它们以确定我需要将哪些文件从新音乐树复制到旧音乐树。

我已经diff --brief -r /oldmusicdir/ /newmusicdir/根据另一个用户的建议进行了尝试,但是 ^C 过程在十五分钟后就结束了(我猜 diff 正在扫描音乐文件本身——这是没有必要的)。

然后我尝试了find /oldmusicdir/ -type d | sort > oldmusicdir旧的和新的,然后运行diff oldmusicdir newmusicdir但是,由于我将音乐目录存储在不同的位置,所以每个条目都被标记了。

接下来我尝试运行find /musicdir/ -type d | basename -s - | sort > musicdir但我的 musicdir 文件只是显示“-”

有人知道如何让 basename 接受来自 STDIN 的数据吗?或者,有人有更好的方法来快速比较两个音乐目录吗?

谢谢!

答案1

当我看到你的问题时,这个rsync实用程序首先出现在我的脑海中。执行类似下面的操作可以快速显示目录中有a但不在的文件b

$ rsync -rcnv a/* b/

-r will recurse into the directories
-c will compare based on file checksum
-n will run it as a "dry run" and make no changes, but just print out the files 
   that would be updated
-v will print the output to stdout verbosely

这是一个不错的选择,因为您还可以比较文件的内容以确保它们匹配。 rsync的增量算法针对此类用例进行了优化。 然后,如果您想b匹配的内容a,您只需删除-n执行实际同步的选项即可。

一些相关问题:

答案2

如何将每个目录的递归目录列表生成到单独的文件中,然后diff在这两个文件上使用?

答案3

如果你喜欢使用一些基于GUI的实用程序,你可以尝试一些比较工具:在Windows下,我最喜欢的是Total Commander(主页:https://www.ghisler.com):它具有非常灵活的功能,可以比较和同步整个目录树;还提供了一个快速的 Diff 工具,可让您检查遇到的差异(对于代码行很有用,对于二进制文件则不太有用)。

在 *ux 中,我知道有 Midnight Commander,但我从未尝试过,而且我不确定是否存在相同的功能。

无论如何,维基百科有一个页面列出了最常用的比较工具:也许你可以在那里找到一些有用的信息:https://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools

最大限度

答案4

另一种方法是使用进程替换来传递diff两个“按需”文件描述符,每个文件描述符都保存来自命令的标准输出。

仅比较每个叶节点文件的示例:

diff -y \
  <(find /oldmusicdir -type f | xargs basename | sort -V) \
  <(find /newmusicdir -type f | xargs basename | sort -V)

当然,您可以对输出进行任何解析/格式化,以find根据您认为合适的方式进行匹配。

相关内容