Výpis adresářů by měl fungovat; např. zde je to, co jsem použil ve skriptu (za předpokladu gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
...který ignoruje obsah .svn
a .git
dirs, ale také jednotlivé soubory s názvem *.zip
/*.gz
/atd.
Upravit: Za účelem filtrování cest ve tvaru dir_a/file1
ale stále diff
soubory se stejným základním názvem, například dir_b/file1
nebo dir_a/b/file1
, pak seznam souborů do diff
by musel být vygenerován (například pomocí find
) a soubor k porovnání odvozený z těchto cest; např. daný
$ 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
vygenerujete seznam souborů k porovnání, s výjimkou například */a/2.txt
ale stále porovnáváme další soubory s názvem 2.txt
. Stačí "najít" všechny soubory kromě ONE/a/2.txt
(lze zde také použít regulární výraz, například .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
což ve skutečnosti ignoruje ONE/a/2.txt
(a TWO/a/2.txt
), ale stále porovnává ostatní soubory s názvem 2.txt
:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
Upravit: Nebo více zábavy s find
(další zábava jako cvičení pro čtenáře), vyberte soubory nebo adresáře, které chcete vyloučit a poté diff
všechno ostatní:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
Výše uvedený příklad vylučuje konkrétní soubor "{top}/a/2.txt", jakýkoli adresář s názvem "b" a vše ostatní je rozdílné. (Namísto jednoduchého „-name b
" můžete také použít "-regex '.*/b'
" - poznámka, žádné koncové "/".)
Měl jsem stejný problém, takže jsem vytvořil opravu na diff
. Oprava ještě nebyla přijata, ale můžete si vytvořit svou vlastní verzi diff
s opravou nebo nainstalujte na Arch Linux s balíčkem AUR.
Zde je diff
patch.
Chcete-li vyloučit adresář directory/sub-directory
, používám
diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory
Ačkoli by to mělo fungovat pro jediné vyloučení, nemělo by to být možné pro dlouhý seznam ignorovaných, jako máte vy.