Robić:
diff -r -X <ignore-list> <src-dir> <dest-dir>
nie wydaje się diff
ignorować wpisów, <ignore-list>
jeśli są one w formie <dir>/<file>
.
Wpisy formularza <file
> są jednak brane pod uwagę. Jest to problem, ponieważ mogę mieć wiele plików o <file>
różnych nazwach w różnych podkatalogach, z których niektórych nie chcę ignorować.
Wydaje się, że na stronie podręcznika nie ma zbyt wielu informacji dotyczących składni wzorców diff
. Z tego, co mogę powiedzieć, to tylko podstawowa nazwa pliku, który jest rozważany przez diff (patrz http://forums.gentoo.org/viewtopic-t-889788-start-0.html, jeśli jesteś zainteresowany).
diff
jest--exclude
opcja jest tak gówniany ...Odpowiedzi:
Listy katalogów powinny działać; np. oto, czego użyłem w skrypcie (zakładając, że gnu diff),
... 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 nadaldiff
plików o tej samej nazwie basename, takich jakdir_b/file1
lubdir_a/b/file1
,diff
należy wygenerować listę plików do wygenerowania (na przykład przy użyciufind
), a plik do porównania wyprowadzić z tych ścieżek; np. danegenerujesz listę plików do porównania, wyłączając na przykład,
*/a/2.txt
ale nadal porównując inne pliki o nazwie2.txt
. Po prostu „znajdź” wszystkie pliki opróczONE/a/2.txt
(można również użyć wyrażenia regularnego, np..*/a/2.txt
)co w efekcie ignoruje
ONE/a/2.txt
(iTWO/a/2.txt
), ale wciąż porównuje inne pliki o nazwie2.txt
:Edycja: Lub, więcej zabawy z
find
(dodatkowa zabawa pozostała jako ćwiczenie dla czytelnika), wybierz pliki lub katalogi do wykluczenia, a następniediff
wszystko inne: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 „/”.)źródło
exclude
wzorce są dopasowane do nazwy pliku (zgodnie z gnu.org/software/diffutils/manual/html_node/… ); ścieżki nie będą działać (jak wfoo/bar.txt
). Aby to zrobić, prawdopodobnie będziesz musiał uruchomić,find
aby wygenerować listę nazw plików i uzyskać ścieżkę do pliku do porównania.diff
zamiast zamiastbasename
find
, jeśli dane wejściowe dodiff
zawierają katalog, przejdzie i porówna pliki w tym katalogu, a niektóre z tych plików mogą wymagać zignorowania ... więc jesteś powrót do kwadratu 1.Miałem ten sam problem, więc utworzyłem łatkę do
diff
. Poprawka nie została jeszcze zaakceptowana, ale możesz zbudować własną wersjędiff
z łatką lub zainstalować na Arch Linux z pakietem AUR .Tutaj jest
diff
poprawka.źródło
Aby wykluczyć katalog
directory/sub-directory
, używamJednak chociaż powinno to działać dla pojedynczego wykluczenia, nie powinno być możliwe stosowanie długiej listy ignorowanych, tak jak masz.
źródło
źródło