是否有任何好的软件可以找到相似的多个文件组,或者一个文件包含另一个文件的一部分?
我有一个目录,里面有很多文件混合在一起。这些文件中,都是不同版本的文件,而且文件名也很乱。
答案1
如何使用 diff 比较两个文件,使用“wc -l”计算差异文本的行数,然后计算两个比较文件中的实际行数。如果差异行明显小于文件的实际行,那么可以肯定地说这些文件更相似。至少这是一个开始。
这是你要做的事情的想法。笔记:这是假设您正在处理非二进制文件
首先,您想要获取每个文件的行数:
$ cat <file1> | wc -l
24
$ cat <file2> | wc -l
18
$ cat <file3> | wc -l
25
$ cat <file4> | wc -l
4
然后,浏览目录,将文件与“diff”进行比较并计算行差异:
$ diff <file1> <file2> | wc -l
47
$ diff -ib <file1> <file3> | wc -l
12
$ diff -ib <file1> <file4> | wc -l
34
这就是基本的想法。
下面的脚本将为您执行此操作(在当前目录上操作),并在差异小于任一文件中的行数时回显。您可以将其修改为更加谨慎,仅查找比任一文件的行号少 10+ 的 diff 行计数的匹配项。
for i in `ls`; do
for f in `ls`; do
if [ $i != $f ]; then
F_LINES=`cat $f | wc -l`;
I_LINES=`cat $i | wc -l`;
DIFF=`diff -ib $i $f | wc -l`;
if [ $I_LINES -ge $DIFF ]; then
if [ $F_LINES -ge $DIFF ]; then
echo "SIMILAR: $i [lines: $I_LINES] - $f [lines: $F_LINES] - # lines different: $DIFF";
fi;
fi;
fi;
done;
done
正如我所说,这个脚本没有什么特别的,可以大大简化,但我是即时执行的。它会输出类似这样的内容(给出上面的测试文件示例)。
SIMILAR: <file1> [lines: 24] - <file3> [lines: 25] - # lines different: 12
SIMILAR: <file3> [lines: 25] - <file1> [lines: 24] - # lines different: 12