Listy katalogów powinny działać; np. oto, czego użyłem w skrypcie (zakładając, że gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... która ignoruje zawartość .svn
i .git
katalogi, ale także pojedyncze pliki o nazwie *.zip
/ *.gz
/ etc.
Edycja: W celu filtrowania ścieżek formularza, dir_a/file1
ale nadal diff
plików o tej samej nazwie basename, takich jak dir_b/file1
lub dir_a/b/file1
, diff
należy wygenerować listę plików do wygenerowania (na przykład przy użyciu find
), a plik do porównania wyprowadzić z tych ścieżek; np. dane
$ 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
generujesz listę plików do porównania, wyłączając na przykład, */a/2.txt
ale nadal porównując inne pliki o nazwie 2.txt
. Po prostu „znajdź” wszystkie pliki oprócz ONE/a/2.txt
(można również użyć wyrażenia regularnego, np. .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
co w efekcie ignoruje ONE/a/2.txt
(i TWO/a/2.txt
), ale wciąż porównuje inne pliki o nazwie 2.txt
:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
Edycja: Lub, więcej zabawy z find
(dodatkowa zabawa pozostała jako ćwiczenie dla czytelnika), wybierz pliki lub katalogi do wykluczenia, a następnie diff
wszystko inne:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
Powyższy przykład wyklucza konkretny plik „{top} /a/2.txt”, dowolny katalog o nazwie „b” i wszystko inne jest odmienne. (Zamiast prostego „ -name b
” można również użyć „ -regex '.*/b'
” - uwaga, bez końcowego „/”.)
diff
jest--exclude
opcja jest tak gówniany ...