如何区分源文件?

时间:2010-04-20 08:16:03

标签: c diff

我有两个几乎相似的源代码树,但是无法访问源代码库,因此我遇到了包含测试报告,文档,二进制文件等的发布包。

diff命令仅支持--exclude,但我想做diff -wbur --include='*.c,*.h' tree1 tree2

之类的操作

我知道this question有点相关,但并没有真正解决我的问题。

忽略完全在C注释中的更改块的加分点:)

5 个答案:

答案 0 :(得分:14)

tree1 find . -name '*.[ch]' -exec diff -wibu {} ../tree2/{} \; {{1}}

中,谷歌帮助结果的修改很少

答案 1 :(得分:4)

这是一个小补丁制作者脚本:

#!/bin/bash

USAGE="USAGE: $0 <dist dir> <edited dir>"

[ '--help' == "$1" ] && { echo $USAGE; exit 0; }
[ 2 -eq $# ] || { echo $USAGE; exit 1; }

# trim starting './' and trailing /'/
original=$(echo $1 | sed 's-^\./--;s-/$--')
changed=$(echo $2 | sed 's-^\./--;s-/$--')

[ -d $original ] || { echo "ERROR: Directory $original does not exist" >&2 ; exit 2; }
[ -d $changed ] || { echo "ERROR: Directory $changed does not exist" >&2; exit 3; }

#command="ls -l"
command="diff -Naur"

find $original -name '*.[ch]' -o -name '*.cpp' | sed 's-^[^/]*/--' | { while read file; do $command  $original/$file $changed/$file; done; }

答案 2 :(得分:2)

我会排除所有与.c或.h不匹配的内容。所以这意味着它只包含.c和.h文件:

diff -x "*.[^ch]"

对我而言,这是最好的方法,因为你只使用diff

答案 3 :(得分:2)

您可以将要排除的所有文件写入临时文件,并将其提供给diff的-X参数。

find tree1 tree2 -type f -not -name '*.[ch]' >exludes
diff -wbur tree1 tree2 -X excludes

或更简单(适用于Bash):

diff -wbur tree1 tree2 -X <(find tree1 tree2 -type f -not -name '*.[ch]')

如果文件扩展名较长,则可以使用多个名称参数:

diff -wbur tree1 tree2 \
  -X <(find tree1 tree2 -type f -not -name '*.java' -and -not -name '*.sql')

答案 4 :(得分:0)

我提出了一个比找到维护者更容易的解决方案,这里是线程: http://lists.gnu.org/archive/html/bug-diffutils/2014-10/msg00000.html

这个想法是提供一个新选项,指示diff解析与正则表达式匹配的文件,如: diff -Nurp --only "*.[hc]" source/ source-new/

以下是修补diffutils的说明

克隆回购 git clone git://git.savannah.gnu.org/diffutils.git

在diffutils目录中运行bootstrap.sh并解析依赖项,直到它创建./cofigure脚本

从上面的链接下载补丁

应用它 git apply <PATCHFILE>

配置和编译 ./configure make

这将在src / diff

中创建修补的diff

干杯