2010-04-20 24 views
8

Ho due alberi di codice sorgente quasi simili, ma non hanno accesso al repository del codice sorgente così mi sono bloccato con i pacchetti di rilascio che contengono anche testare i rapporti, documentazione, binari eccCome diff solo i file sorgente?

il comando diff solo il supporto --exclude, ma mi piacerebbe fare qualcosa come diff -wbur --include='*.c,*.h' tree1 tree2

So che this question è in qualche modo correlato, ma in realtà non affronta il mio problema.

punti bonus per ignorare i blocchi di modifica che sono completamente in C commenti :)

risposta

14

piccola modifica ad un risultato da google aiutato, in tree1 fatto find . -name '*.[ch]' -exec diff -wibu {} ../tree2/{} \;

+1

Per gli alberi di origine C++, provare '-name '* .h "-o -name" * .cpp "' nel comando precedente – mgold

4

Ecco un piccolo script Patch Maker:

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

Escluderei tutto ciò che non corrisponde .c o .h. Quindi vuol dire che include solo i file .c e .h:

diff -x "*.[^ch]" 

Per me è il modo migliore per farlo, perché si sta utilizzando solo diff

+0

Questo non funziona correttamente: include estensioni come .cpp, .hxx, .cache e .help. – cmaster

0

ho proposto una soluzione più facile che trovare per manutentori diff , ecco il filo: http://lists.gnu.org/archive/html/bug-diffutils/2014-10/msg00000.html

l'idea è quella di fornire una nuova opzione che istruisce diff per analizzare il file corrispondente a una regex, come: diff -Nurp --only "*.[hc]" source/ source-new/

Ecco le istruzioni per rattoppare diffutils

Clone repo git clone git://git.savannah.gnu.org/diffutils.git

corsa bootstrap.sh all'interno Diffutils directory e risolvere le dipendenze fino a quando si crea lo script ./cofigure

Scaricare la patch dal link qui sopra

Applicalo git apply <PATCHFILE>

Configurare e compilare ./configure make

Questo creerà la diff patch in src/diff

Acclamazioni

+0

Ho aggiunto il patch che risolve il mio problema ow sembra essere una buona risposta per me :) – geckos

2

È possibile scrivere tutti i file da escludere in un file temporaneo e dare a tesi di diff -X.

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

O semplici di (opere in Bash):

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

è possibile utilizzare più argomenti di nomi se avete le estensioni dei file più lunghi:

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