比较两个目录结构而不实际比较文件中数据的最佳和最简单方法是什么?这工作正常:
diff -qr dir1 dir2_
但这确实很慢,因为它也在比较文件。是否有一个用于diff的开关或另一个简单的cli工具来做到这一点?
-type d
从@slartibartfast的答案中删除该选项,或者查看我的答案。
比较两个目录结构而不实际比较文件中数据的最佳和最简单方法是什么?这工作正常:
diff -qr dir1 dir2_
但这确实很慢,因为它也在比较文件。是否有一个用于diff的开关或另一个简单的cli工具来做到这一点?
-type d
从@slartibartfast的答案中删除该选项,或者查看我的答案。
Answers:
以下内容(如果您将第一个目录替换为directory1,将第二个目录替换为directory2)应立即执行所需的操作:
find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1
基本原理是,它打印出所有目录,包括相对于基本目录N目录的子目录路径。
如果您在某些目录名称中有回车符,而在其他目录中没有回车符,则可能会下降(产生奇怪的输出)。
diff -rq
只是显示根目录存在于其中,然后继续。
vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)
将为您很好地并排显示两个目录层次结构,并折叠所有公共部分。
我通常rsync
用于此任务:
rsync -nav --delete DIR1/ DIR2
请务必始终使用-n
,aka--dry-run
,选项,否则它将同步(更改目录的内容)。
这将根据文件修改时间和大小比较文件...我想这就是您真正想要的,或者至少您不介意这样做吗?我感觉到您只是希望它发生得更快,而不是您需要它忽略文件内容之间的差异。如果您确实希望它不列出具有相同名称的不同文件,那么我认为添加该--ignore-existing
选项即可。
另外要注意,不要把一个/
在结束DIR1
将导致其比较目录 DIR1
与内容的DIR2
。
输出最终有点冗长,但是它将向您显示哪些文件/目录不同。存在于DIR2
和不存在于其中的文件/目录DIR1
将以单词开头deleting
。
在某些情况下,@ slartibartfast的答案可能更合适,尽管您需要删除-type d
启用非目录文件列表的选项。 rsync
如果您要比较的文件/目录数量很多,则速度会更快。
deleting...
文本,但这可能是在保持速度的同时比较文件的更好方法之一。当不需要差异文件时,这里的其他答案会更快...就像在OP的示例中一样,但我真的很喜欢这一点。
sudo -u nobody rsync -nav --delete d1 d2
前提是“其他”的标志允许阅读。
与ls答案类似,但是如果您安装树,则可以
tree dir1 > out1
tree dir2 > out2
diff out1 out2
diff <( tree dir1 ) <( tree dir2 )
i
标志的树,该标志不会显示树线(tree -i dir1
,等)。如果目录结构在一个地方不同,则匹配的其他文件|
在树输出中可能会有更多或更少的符号,即使文件路径相同,diff也会捕获这些行。
我只是在寻找解决此问题的方法。我最喜欢的解决方案是:
comm <(ls DIR1) <(ls DIR2)
它为您提供3列:1-仅在DIR1中的文件,2-仅在DIR2中的文件,3-仅在DIR3中的文件有关更多详细信息,请参阅此博客文章。
DIR3
指定在哪里?我所看到的是DIR1
和DIR2
。
DIR1
在第1列,只有在所有文件DIR2
中的第2列,和所有文件通过共享双方在第3列。这很有用,但是您知道如何去除第3列并仅保留差异吗?我要整理的文件很多,而且大多数文件是相同的。我不需要看看有什么相同。
comm <(ls DIR1) <(ls DIR2)
递归无效。为此我用comm <(ls -R1 DIR1) <(ls -R1 DIR2)
。ls -R
递归地浏览目录,并且ls -1
(请注意那是一个,而不是L)使ls
每行仅打印一个文件名。
comm -3
请参阅参考资料man comm
)。
这是最佳解决方案
diff --brief -r dir1 dir2
--brief开关仅报告文件是否不同,而不报告差异的详细信息。
-q
在问题中存在,这是的别名--brief
。该答案未提供任何新信息。
But it's really slow because it's comparing files too.
我认为只有rsync是userfull。为什么?
diff仅对保留文件和目录的结构有用。当我们使用符号链接时,Diff没有给出足够的退出代码。在这种情况下,即使src和dst相同(时间,大小,名称,时间戳,指向软链接等),diff也可以返回2个退出代码。
dir,即使src和dst上的目录内容相同,文件系统也不保证文件顺序。也许您应该通过排序对ls输出进行过滤。但是纯ls仅显示节点名称。
也许包括diff,cmp,test -X的节点类型的脚本将很有用,但请记住许多test / cmp运行造成的过载。该脚本将非常慢。
像往常一样,如果要获取简单的信息“目录是否相同”,则应将rsync与-n(干)选项一起使用。如果要查找不同之处,请使用diff命令。