我有两个几乎相似的源代码树,但是无法访问源代码库,因此我遇到了包含测试报告,文档,二进制文件等的发布包。
diff
命令仅支持--exclude
,但我想做diff -wbur --include='*.c,*.h' tree1 tree2
我知道this question有点相关,但并没有真正解决我的问题。
忽略完全在C注释中的更改块的加分点:)
答案 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干杯