Le directory di elenco dovrebbero funzionare; ad esempio, ecco cosa ho usato in uno script (supponendo gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... che ignora i contenuti di .svn
e .git
dirs, ma anche i singoli file denominati *.zip
/ *.gz
/ etc.
Modifica: per filtrare i percorsi del modulo dir_a/file1
ma ancora i diff
file con lo stesso nome di base, come dir_b/file1
o dir_a/b/file1
, quindi diff
dovrebbe essere generato un elenco di file (ad esempio, utilizzando find
) e il file da confrontare derivato da questi percorsi; ad es. dato
$ find ONE TWO -type f -print
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt
si genera l'elenco di file da confrontare, escludendo ad esempio */a/2.txt
ma confrontando comunque altri file denominati 2.txt
. Basta "trovare" tutti i file tranne ONE/a/2.txt
(un regexp può essere utilizzato anche qui, come .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
che in effetti ignora ONE/a/2.txt
(e TWO/a/2.txt
), ma confronta ancora gli altri file chiamati 2.txt
:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
Modifica: Oppure, più divertente con find
(ulteriore divertimento lasciato come esercizio per il lettore), seleziona i file o le directory da escludere e poi diff
tutto il resto:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
L'esempio sopra esclude il file specifico "{top} /a/2.txt", qualsiasi directory denominata "b" e tutto il resto è diff. (Invece del semplice " -name b
" potresti anche usare " -regex '.*/b'
" - note, no trailing "/".)
diff
'--exclude
opzione è così