启发式地发现一组文件的不同之处

启发式地发现一组文件的不同之处

我有大量通过重复运行测试套件生成的输出文件,并且希望大致了解它们有多么不同。理想情况下,它们应该全部相同(表明测试完全可重复)或几乎相同(例如,如果存在时间戳)。所以我正在寻找这样的脚本:

show-greatest-diff /path/to/files/*.out

因此,如果存在 100 个 *.out 文件,脚本应该将diff它们全部相互对抗,并可能生成其中任何对不同的行/字符的最大数量(并且可能识别最不同的对),或者只打印diff输出差异最大的对或产生一些其他启发式有用的输出。

建议的解决方案这里由于文件数量较多,不适合我的用例。

答案1

怎么样

mostdifs=-1;
for f1 in path/to/files/*.out; do 
    for f2 in path/to/files/*.out; do 
        difs=$(diff "$f1" "$f2" | wc -l); 
        [ "$difs" -gt "$mostdifs" ] && mostdifs=$difs && mostdif="$f1 : $f2";
    done 
done 
echo "$mostdif"

这非常简单,您可以通过测试是否$f1与其他文件相同$f2以及通过各种其他调整来改进它,但如果我们谈论的是几百个文本文件,它将在几秒钟内运行,因此额外的复杂性可能不值得。

这个想法是在每对文件上运行diff并查看返回的行数。如果该数字大于当前最大数字,则保存文件名。

相关内容