2010-04-20 8 views
8

tengo dos árboles de código fuente casi similares, pero no tienen acceso al repositorio de código fuente, así que estoy atascado con paquetes de liberación que también contienen los informes de ensayo, documentación, etc. binarios¿Cómo diferenciar solo los archivos fuente?

el comando diff sólo admiten --exclude, pero me gustaría hacer algo como diff -wbur --include='*.c,*.h' tree1 tree2

Sé que this question es algo relacionado, pero realmente no aborda mi problema.

puntos de bonificación para ignorar los bloques de cambio que están completamente en los comentarios en C :)

Respuesta

14

pocas modificaciones a consecuencia de Google ayudó, en tree1 hicieron find . -name '*.[ch]' -exec diff -wibu {} ../tree2/{} \;

+1

Para C árboles de origen ++, intente '-nombre '* .h "-o -name" * .cpp "' en el comando anterior. – mgold

4

Aquí hay un pequeño script del realizador del parche:

#!/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

Excluiría todo lo que no coincida con .c o .h. Por lo que significa que sólo incluirá los archivos .c y .h:

diff -x "*.[^ch]" 

Para mí es la mejor manera de hacerlo, ya que sólo está usando diff

+0

Esto no funciona correctamente: incluye extensiones como .cpp, .hxx, .cache y .help. – cmaster

0

he propuesto una solución más fácil que encontrar a los mantenedores del diff , aquí está el hilo: http://lists.gnu.org/archive/html/bug-diffutils/2014-10/msg00000.html

la idea es proporcionar una nueva opción que instruye diff para analizar en los archivos que coincidan con una expresión regular, como: diff -Nurp --only "*.[hc]" source/ source-new/

Aquí están las instrucciones para parchear diffutils

Clonar el repositorio git clone git://git.savannah.gnu.org/diffutils.git

plazo bootstrap.sh dentro Diffutils directorio y resolver las dependencias hasta que se crea el guión ./cofigure

Descarga el parche de enlace anterior

Aplicarlo git apply <PATCHFILE>

Configurar y compilar ./configure make

Esto creará el diff parcheado en src/diff

Saludos

+0

He agregado el parche que resuelve mi problema. N ow parece ser una buena respuesta para mí :) – geckos

2

Puede escribir todos los archivos para excluir en un archivo temporal y darle al argumento del diff -X.

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

O simplier (funciona en Bash):

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

puede utilizar varios argumentos de nombre si tiene extensiones de archivos más largos:

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