如果要查找两个目录树之间的差异,通常只执行:
diff -r dir1/ dir2/
这将准确输出相应文件之间的区别。我只想获取内容不同的相应文件的列表。我以为这只是将命令行选项传递给的问题diff
,但是我在手册页上找不到任何内容。
有什么建议么?
dircmp
在UNIX(未Linux)的命令
如果要查找两个目录树之间的差异,通常只执行:
diff -r dir1/ dir2/
这将准确输出相应文件之间的区别。我只想获取内容不同的相应文件的列表。我以为这只是将命令行选项传递给的问题diff
,但是我在手册页上找不到任何内容。
有什么建议么?
dircmp
在UNIX(未Linux)的命令
Answers:
您说过Linux,所以您很幸运(至少它应该可用,不确定何时添加):
diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options
应该做你所需要的。
如果您还想查看两个目录中可能不存在的文件的差异,请执行以下操作:
diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options
diff -qr dir1/ dir2/
,我的扩展版本为diff -qr dir1/ dir2/ | grep ' differ'
--brief
了它的快捷方式-q
。
--brief
。-brief
被解释为-b -r -i -e -f
,换言之,被解释为一组标志,而不是单个选项。
我使用的命令是:
diff -qr dir1/ dir2/
它与Mark的完全相同:)但是他的回答使我感到困扰,因为它使用了不同类型的标志,并且使我看上去两次。使用Mark更详细的标志,它将是:
diff --brief --recursive dir1/ dir2/
当其他答案完全可以接受时,我深表歉意。不能阻止自己...努力减少学究。
q
?它是某物的缩写吗?我找不到任何逻辑q
..
q
是for的quiet
,通常意思是比较冗长。
我喜欢用 git diff --no-index dir1/ dir2/
,因为它可以显示颜色差异(如果您在git config中设置了该选项),并且因为它在长页输出中使用“少”显示了所有差异。
--no-index
在stackoverflow.com/a/1792477/473390上添加更多内容。我已经更新了@ alan-porter答案。
--name-status
到命令行,它将仅显示带有“ M / A / D”标志的文件名列表,以表示“修改/添加/删除”状态。
这两个命令基本上可以完成所需的任务:
diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt
rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt
它们之间的选择取决于dir1和dir2的位置:
当目录位于两个单独的驱动器上时,diff的性能优于rsync。但是,当比较的两个目录位于同一驱动器上时,rsync更快。这是因为diff并行将几乎相等的负载放在两个目录上,从而最大程度地增加了两个驱动器上的负载。
rsync在实际比较校验和之前先计算大块校验和。这样,将I / O操作按大块进行分组,并在单个驱动器上进行处理时可以提高处理效率。
rsync --options /usr /bin /var /sbin /lib /old_root
可以有效地比较当前根/
(通过指定其中的所有子目录)和/old_root
(例如,包含的某些旧备份/
),这diff -r
可以不行 并且,如果您假设具有相同大小,权限和时间戳的文件可能没有更改,那么省去--checksum
将为您提供非常快的检查(如果不这样做的话)哪些文件可能已更改。
--delete
与rsync
?
--dry-run
标志),什么都不会真正删除,rsync
仅打印dir1中的文件,而不打印dir2中的文件
--dry-run
始终放在第一位,以免意外遗忘它。
meld
如果在大型目录上使用它会变得非常缓慢。有什么可以更好地处理大型目录的吗?
find dir1 dir2 | cut -d/ -f2- | sort | uniq --unique
meld <(find dir1 -ls ) <(find dir2 -ls)
使用bash进程替换效果很好。(zsh的=(command)
工作效果更好。)
频道同胞“ billings”(具有freenode /#centos的声誉)与我分享了他的方法:
diff -Naur dir1/ dir2
包括最终目录的正斜杠无关紧要。
此外,该-u
选项似乎在某些较旧/服务器版本的diff上不可用。
差异的区别:
# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST
# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ
--new-file/-N
这使得diff --text/-a
会将丢失的文件视为空文件,并使其将所有二进制输入都视为文本。我看不到这种特殊用例的好处。
Diffoscope是一个很棒的基于命令行的目录diff工具。
我特别喜欢它可以扩散到文件中:
它将递归解压缩各种档案,并将各种二进制格式转换为更易于阅读的形式以进行比较。它可以轻松地比较两个tarball,ISO图像或PDF。
它不仅会告诉您哪些文件不同,而且还会告诉您它们如何不同。
您也可以使用Rsync
和find
。对于find
:
find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER
但是具有相同名称和相同子文件夹但具有不同内容的文件将不会显示在列表中。
如果你是GUI的球迷,你可以检查合并是@Alexander提及。它在Windows和Linux中都可以正常工作。