我可以得到`diff -q`的反义词吗?匹配相同文件而不打印其内容


13

我的目录中有许多文件,我想检查它们是否唯一。为简单起见,假设我有三个文件:foo.txtbar.txtbaz.txt。如果运行此循环,则将彼此进行检查:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

对于我要处理的数百个文件,这将变得非常难以阅读;最好列出确实匹配的文件,然后我可以快速查看列表并确保文件仅匹配自己。从联机帮助页来看,我认为该-s选项可以完成此任务:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

...但是,实际上,它还会打印出所有不同文件的全部内容。有什么办法可以抑制这种行为,所以我只能得到上面的行为?

另外,还有其他工具可以完成此任务吗?

Answers:


6

如果只想检查两个文件是否相同,请使用cmp。要仅获取相同文件的输出,可以使用

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff 尝试生成简短的,易于理解的差异列表,这可能会花费大量时间,因此如果不需要,可以避免开销。


12

这应该可以解决问题:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

其中,dir1dir2是你的两个目录。

如果您只想从中打印匹配的目录dir1

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

同样,如果您只想从中打印匹配的目录dir2

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

这正是我在寻找的东西,谢谢!
Joshua Soileau

diff -qrs比较大型文件时使用(安静可消除打印差异)
marcovtwout 2015年

4

为此目的而编写的最快的工具是fdupes(可在Fedora和Ubuntu和…的软件包存储库中找到)。

用法:

fdupes -r dir1 dir2

2

如果您需要在列表中查找相同的文件,请首先按大小对其进行排序,例如使用

ls -S

然后对每组相同大小的文件运行md5sum它们,以轻松查看哪些文件与哪些文件相同。

对于大文件,可以更快地首先对整个文件的一小部分进行校验和:

dd if=file bs=512 count=1 | md5sum

然后仅对可疑文件执行完整的校验和。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.