在两个目录中查找最匹配的文件

在两个目录中查找最匹配的文件

我正在尝试找到以下问题的解决方案。我有两组文件:

  • 文件夹 A 包含大约 400 个文本文件。
  • 文件夹 B 的几个子文件夹中总共有大约 20,000 个文本文件。

文件夹 A 中的文件要么是文件夹 B 中文件的修改版本,要么是文件夹 B 中文件的一部分。当我说“部分”时,我的意思是文件夹 A 中的文件可能包含文件夹 B 中文件的部分文本,但不是全部。

我想要匹配这些对,即对于文件夹 AI 中的每个文件,想要找到文件夹 B 中与文件夹 A 中的文件最相似的一个或多个文件。

例如,我想要以下类型的报告:

File ./A/foo123.txt most closely matches file ./B/bar243.txt with 68% of lines identical.
File ./A/bar306.txt most closely matches file ./B/foo85.txt with 30% of lines identical.

我可以使用命令行工具来实现此结果吗?或者最好的方法是什么?

答案1

像这样的事情会起作用:

for fa in A/*; do

    highest_pm=0

    for fb in B/*; do

    num_identical_lines=$(diff --unchanged-group-format='%<' --old-group-format='' --new-group-format='' --changed-group-format='' "$fa" "$fb" | wc -l)
    num_lines_file_a=$(wc -l < "$fa")

    # save permille of matching lines
    pm=$((1000*num_identical_lines/num_lines_file_a))

    # compare with highest permille
    if [ $pm -gt $highest_pm ]; then
        highest_pm=$pm
        best_match="$fb"
    fi

    done

    # output
    [ $highest_pm -gt 0 ] \
    && printf "File %s best matches File %s with %d %% of identical lines.\n" "$fa" "$best_match" $((highest_pm/10)) \
    || printf "File %s has no match\n" "$fa"

done

num_identical_lines 的评估为基于这个答案
剩下的只是文件循环、一些比较和一些输出;-)

输出:

File A/file2 has no match
File A/filea best matches File B/fileb with 50 % of identical lines.

相关内容