Czy istnieje sposób, w jaki mogę wykonać rekursywną różnicę dwóch katalogów, ale porównywać tylko (w odpowiednich miejscach) pliki, które pasują do określonej nazwy pliku lub predykatu typu pliku?
Np. Chciałbym zrobić coś takiego
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
... lub nawet lepiej:
diff -r dir-a dir-b -filetype text
Oczywiście nie jest to obowiązkowe, diff
ponieważ, jak sądzę, inkantacja find
i -exec diff
może również załatwić sprawę (po prostu nie wiem, jak wygenerować uzupełniające ścieżki plików w tym drugim przypadku).
command-line
find
diff
Marcus Junius Brutus
źródło
źródło
Odpowiedzi:
Skrypt powłoki
differ-r
Ten skrypt powłoki może wykonywać rekurencyjną różnicę dwóch katalogów, ale tylko porównywać (w odpowiednich miejscach) pliki, które pasują do określonego wzorca nazwy pliku lub typu pliku.
Próbny
Akta:
Stosowanie:
Bieganie
differ-r
:Przeprowadzone
diff
linii poleceń są drukowane z zielonym tekstem i wyjścia, gdy nie ma mecz zostanie wydrukowany tekst domyślny (biały na czarnym na poniższym zrzucie ekranu).rsync
z filtremJeśli nie potrzebujesz żadnych danych wyjściowych opisujących różnicę, wiedz tylko, które pliki są inne lub ich brakuje (aby
rsync
je skopiować), możesz użyć następującego wiersza polecenia.Próbny
Jeśli chcesz uzyskać czysty wynik bez komentowania wierszy i katalogów, możesz uzyskać
grep
wynik w ten sposób,Skrypt powłoki
rsync-diff
Ten jednowierszowy można przekształcić w podstawowe polecenie powłoki
rsync-diff
.źródło
Ponieważ wspomniałeś „Oczywiście nie jest obowiązkowe używanie diff”,
Należy to zrobić dla ciebie zadanie łączą łatwo konfigurowalny za jakie rodzaje plików zignorować:
ponadto inną alternatywą byłoby napisanie prostego skryptu, który przeniesie z białej listy na czarną listę, a następnie czarna lista zostanie przekazana do diff z
--exclude
opcją.źródło
Dzięki powłoce obsługującej zastępowanie poleceń możesz użyć następującego jednowierszowego (jak już zauważył @JammingThebBits):
Działa to w następujący sposób:
find
wyszukaj pliki, które nie są interesujące,sed
wypakuj basename (działabasename
bardzo wolno, jeśli masz wiele plików) i umieści je w pliku tymczasowym ; taki plik jest następnie przekazywany dodiff
polecenia wykluczenia ich z porównania (podwójne wykluczenie = włączenie).Jeśli nie masz podstawiania poleceń, umieść dane
sed
wyjściowe w pliku i jawnie przekaż jediff
.W przykładzie szukałem tylko pliku XML i JAVA, zmień je w razie potrzeby, oddzielając je znakiem OR.
źródło