Linux:比较目录结构而不比较文件

Jon*_*nah 61 linux comparison

在不实际比较文件中的数据的情况下比较两个目录结构的最佳和最简单的方法是什么?这工作正常:

diff -qr dir1 dir2_
Run Code Online (Sandbox Code Playgroud)

但它真的很慢,因为它也在比较文件。是否有 diff 或其他简单的 cli 工具的开关来执行此操作?

Sla*_*ast 41

以下(如果您将第一个目录替换为 directory1,将第二个目录替换为 directory2)应该可以快速完成您正在寻找的操作:

find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1
Run Code Online (Sandbox Code Playgroud)

基本原理是它打印出所有目录,包括相对于基本目录N 个目录的子目录路径。

如果您在某些目录名称中有回车,而在其他目录名称中没有回车,这可能会下降(产生奇怪的输出)。


gar*_*ohn 35

vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)
Run Code Online (Sandbox Code Playgroud)

会给你一个很好的并排显示两个目录层次结构,所有公共部分都折叠了。

  • 此解决方案随机失败。当 vim 读取(或重新读取)临时文件描述符时,它已经消失了。 (3认同)

int*_*ted 23

我通常rsync用于此任务:

rsync -nav --delete DIR1/ DIR2
Run Code Online (Sandbox Code Playgroud)

始终使用-n, aka--dry-run, 选项要非常小心,否则它会同步(更改目录的内容)。

这将根据文件修改时间和大小比较文件...我认为这就是您真正想要的,或者至少您不介意这样做吗?我觉得你只是希望它发生得更快,而不是你需要它来忽略文件内容之间的差异。如果您确实希望它不列出具有相同名称的不同文件,我认为添加该--ignore-existing选项可以做到这一点。

另外要注意,不要把一个/在结束DIR1将导致其比较目录 DIR1内容DIR2

输出最终有点冗长,但它会显示哪些文件/目录不同。存在于DIR2和不存在的文件/目录DIR1将以deleting.

对于某些情况,@slartibartfast 的答案可能更合适,但您需要删除-type d启用非目录文件列表的选项。 rsync如果您要比较大量文件/目录,速度会更快。


小智 21

类似于 ls 答案,但如果您安装树,则可以

tree dir1 > out1
tree dir2 > out2
diff out1 out2
Run Code Online (Sandbox Code Playgroud)

  • 或者为了避免 tmpfiles,`diff &lt;( tree dir1 ) &lt;( tree dir2 )` (7认同)
  • diff &lt;( tree -i dir1 ) &lt;( tree -i dir2 ) 是迄今为止最好的答案。我很想对所有建议 diff 或 rsync 的答案投反对票,因为问题明确指出不要读取文件内容。注意:建议使用两个管道需要小心使用括号之间的空间,请严格按照示例进行操作。例如,要在备份后比较两个 20G 卷,树回答需要大约 5 秒。其他人花了20多分钟。 (2认同)

小智 7

这满足了我在预期匹配的树中查找丢失文件的特定需求。

diff <( cd dir1; find * |sort ) <(cd dir2; find * | sort)
Run Code Online (Sandbox Code Playgroud)