Bash目录内容之间的递归相似性

时间:2015-12-03 09:06:45

标签: linux bash recursion compare diff

我正在寻找一个bash命令/脚本,它将执行以下操作:

  1. 有两个具有不同结构和文件名的目录结构
  2. 查找一个结构中与另一个目录结构中另一个文件中的一行相同的所有行
  3. E.g。 line 56 "int archiveHex = 0x.." in file1.cpp is the same as same as line 89 of fileArchive.cpp。当然,在那个阶段不需要行号,行内容是好的。

    长话故事我确实有两个项目都非常大,我想看看有没有人将其中一个项目的GPL代码用于他的商业产品。然而,文件和目录结构的名称已更改,但我看到相似之处,我相信他们会复制一些内容。

    我发现了这两个相关的问题:

    但无论如何我不知道如何将所有这些结合起来。你会怎么做?

1 个答案:

答案 0 :(得分:1)

这可以通过一些shell和Awk脚本来完成。将第一个目录文件的所有行读入一个数组,然后对于每个输入行,查看它是否是数组中定义的键。 (我正在过滤掉空白行以减少误报。也可以在过滤器中添加空注释。)数组键是行的内容,数组键的值是一个标识源文件名和行号的字符串。我们可以方便地从grep -nr

中以冒号分隔的值接收这些值
grep -nrv '^[[:space:]]*$' "$srcdir" |
awk -F : 'NR==FNR { a[substr($0, length($1 ":" $2 ":")+1)] = $1 ":" $2; next }
    $0 in a { print FILENAME ":" FNR " matches " a[$0] ":" $0; result=1}
END { exit 1-result }' - $(find "$otherdir" -type f)

Awk脚本基本上非常简单; NR==FNR是一个常见的习惯用法,它匹配第一个输入文件(这里是标准输入,来自grep的管道),这是我们获取数组a的值的地方。对于后续输入文件,如果输入行是数组中的键,则触发。 Awk的关联数组类型在这里是理想的。

这假设您没有包含冒号或换行符的文件名。它还假设find输出足够小,不会触发“参数列表太长”错误,但如果确实如此,则更容易修复。