我有两个音乐库,一个比另一个更新。我想比较它们以确定我需要将哪些文件从新音乐树复制到旧音乐树。
我已经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
根据您认为合适的方式进行匹配。