比较两个目录结构而不实际比较文件中的数据的最好和最简单的方法是什么? 这很好用:
diff -qr dir1 dir2_
但是它真的很慢,因为它也在比较文件。有没有 diff 的开关或者另一个简单的 cli 工具来做这个?
答案1
以下操作(如果将第一个目录替换为 directory1,将第二个目录替换为 directory2)应该可以快速完成您要查找的操作:
find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1
基本原理是打印出所有目录包括相对于基目录N目录的子目录路径。
如果某些目录名称中有回车符而其他目录名称中没有,则可能会失败(产生奇怪的输出)。
答案2
vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)
将为你提供两个目录层次结构的并排显示,其中所有公共部分均已折叠。
答案3
我通常用于rsync
完成这项任务:
rsync -nav --delete DIR1/ DIR2
要特别小心总是使用-n
,又名--dry-run
,选项,否则它将同步(更改目录的内容)。
这将根据文件修改时间和大小比较文件...我思考这才是你真正想要的,或者至少你不介意它这样做?我感觉你只是希望它发生快点,但您不需要它来忽略文件内容之间的差异。如果您确实希望它不列出具有相同名称的不同文件,我认为添加该--ignore-existing
选项可以做到这一点。
还要注意,如果不在/
末尾加上DIR1
,将导致它比较目录 DIR1
与内容的DIR2
。
输出结果可能有点冗长,但它会显示哪些文件/目录不同。 中存在DIR2
和不存在的文件/目录DIR1
将以单词 开头deleting
。
对于某些情况,@slartibartfast 的答案可能更合适,但您需要删除-type d
启用非目录文件列表的选项。 rsync
如果您有大量文件/目录需要比较,速度会更快。
答案4
这满足了我在预期匹配的树中查找丢失文件的特定需求。
diff <( cd dir1; find * |sort ) <(cd dir2; find * | sort)