Czy można porównać dwa katalogi z rsync i wydrukować tylko różnice? Istnieje opcja uruchamiania na sucho, ale kiedy zwiększę gadatliwość do pewnego poziomu, pokazywany jest każdy porównywany plik.
ls -alR
i diff
nie ma tu opcji, ponieważ w źródle znajdują się dowiązania twarde, dzięki czemu każda linia jest inna. (Oczywiście, mogłem usunąć tę kolumnę za pomocą perla.)
directory
rsync
file-comparison
Chris
źródło
źródło
Odpowiedzi:
Prawdopodobnie będziesz musiał przebiec
rsync -avun --delete
w obu kierunkach.Ale co tak naprawdę próbujesz osiągnąć?
Aktualizacja :
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
da ci listę plików, które nie istnieją w katalogu docelowym."grep delet", ponieważ każdy odbitek linii: delet ing ..file ..
rsync -avun $SOURCE $TARGET
da ci listę „różnych” plików (w tym nowych plików).źródło
Aby dodać do odpowiedzi Nilsa (dla każdego, kto natknie się na to za pośrednictwem Google), domyślnie
rsync
porównuje tylko rozmiary plików i czasy modyfikacji, aby stwierdzić, czy są jakieś różnice. (Jeśli są różne, robi więcej, ale jeśli są takie same, zatrzymuje się na tym).Jeśli chcesz porównać rzeczywistą zawartość pliku , nawet w przypadku plików o tym samym rozmiarze i czasie ostatniej modyfikacji, dodaj flagę,
-c
aby powiedzieć,rsync
aby porównać pliki przy użyciu sumy kontrolnej.(Ta
-u
opcja mówi rsync, aby ignorowało pliki, które są nowsze$TARGET
niż te$SOURCE
, których prawdopodobnie nie chcesz, jeśli porównujesz zawartość.)źródło
--no-group --no-owner --no-perms --no-times
lub ich kombinację w zależności od potrzeb.-a
zamiast-a
, np.rsync -rlDcnv --delete $SOURCE $TARGET
--delete
do listy pliki istniejące tylko w$TARGET
Tylko dla osób mniej obeznanych z
rsync
:-n
: najważniejszy bit - niczego nie zmieniaj;-rc
: porównaj tylko zawartość (w przeciwnym razie użyj-ac
);-v
: lista plików)--delete
: szukaj symetrycznej, a nie jednokierunkowej różnicy./
oznacza „zajrzyj do katalogu i porównaj jego zawartość z miejscem docelowym”.PS. Wiem, że to okropne PS - ale rzeczywiście zostało dodane w pośpiechu. Niemniej jednak założę się, że może się to przydać.
PPS. Alternatywnie można również zrobić
Jeśli nazwy plików nie zawierają nowych linii, możemy następnie posortować oba
*.md5
pliki idiff
je. (Będzie to jednak działać tylko w przypadku plików; to znaczy, że pusty katalog po obu stronach nie zostanie wykryty).źródło
Zaskakująco żadna odpowiedź od 6 lat nie korzysta z tej
-i
opcji lub daje niezły wynik, więc zacznę:TLDR - Po prostu pokaż mi polecenia
Zrozumienie wyników
Oto przykład wyniku:
Zwróć uwagę na pierwszy znak każdej linii:
L
/R
oznacza, że plik / katalog pojawia się tylko w kataloguL
eft lubR
ight.X
Oznacza to, że po obu stronach pojawia się plik, ale to nie to samo (w tym przypadku kolejne 11 znaków daje więcej info.s
,t
ap
obrazują różnice w ów ize, t ime i p ermissions odpowiednio - aby uzyskać więcej informacji próbowaćman rsync
i szukać--itemize-changes
) .Dodatkowe opcje, których możesz chcieć użyć
Jeśli chcesz również porównać właściciela / grupę / uprawnienia do plików, dodaj odpowiednio opcje
-o
/-g
/-p
. Na koniec zauważ, że domyślnie rsync uważa dwa pliki za takie same, jeśli mają tę samą nazwę, godzinę i rozmiar. Jest to niezwykle szybkie i przez większość czasu więcej niż wystarczające, ale jeśli chcesz być w 100% pewien, dodaj-c
również porównaj zawartość plików o tej samej nazwie, czasie i rozmiarze.TLDR - Po prostu daj mi skrypt do wywołania
Oto jest Nazwij to tak
Obowiązują tu również wszystkie opcje wymienione powyżej w sekcji „Opcje dodatkowe, których możesz chcieć użyć”.
Jak to działa?
Nazywamy rsync w ten sposób:
Używamy
-i
(--itemize-changes
), aby powiedzieć rsync, aby wypisała jeden wiersz danych wyjściowych dla każdego pliku zawierającego informacje o różnicach między dwoma katalogami. Musimy-n
stłumić normalne zachowanie rsync (który polega na próbie synchronizacji dwóch katalogów poprzez kopiowanie / usuwanie plików). musimy również-r
pracować rekurencyjnie dla wszystkich plików / podkatalogów.Nazywamy rsync trzy razy:
Pierwsze połączenie : drukuj pliki, które nie istnieją w Dir_B. Musimy użyć,
--ignore-existing
aby zignorować pliki istniejące po obu stronach.Drugie połączenie : Dokładnie jak poprzednio, ale zamieniamy kolejność DIR_A / DIR_B.
Trzecie połączenie : Wreszcie używamy
--existing
tylko do sprawdzania plików, które pojawiają się w obu katalogach.źródło
Rozumiem z twojego pytania, że nie chcesz używać diff na ls , ale możesz także używać diff rekurencyjnie na katalogach:
źródło
Zajęło mi kilka prób, aby to zadziałało. Odpowiedź Nilsa musi
$TARGET
kończyć się końcem/
, jak wyjaśniono w ジ ョ ー ジ.Oto wersja, która wyraźnie dodaje końcowe
/
:Daje to listę plików, które istnieją poniżej
${SOURCE}
katalogu, ale nie poniżej${TARGET}
katalogu.Używam
sed
tutaj, aby usunąć wiodącedeleting
linie wyjściowe i wydrukować tylko te linie.Nie używam tej
rsync
opcji,-c
ponieważ porównywanie zawartości plików byłoby znacznie wolniejsze w moich przypadkach użycia, a porównywanie tylko rozmiarów plików i czasów modyfikacji wydaje się w tych przypadkach wystarczające. Nie mam powodu podejrzewać, że na moich komputerach występują problemy z przesunięciem zegara lub że coś złośliwie zmieniło znaczniki czasu. Ponadto wynik-c
nie może zmienić decyzji o usunięciu pliku, a jedynie decyzję o aktualizacji lub zachowaniu pliku.Używam również
-u
i-a
(zamiast-r
), dzięki czemu mogę później ponownie użyć wiersza polecenia i zmienić go skopiować wybrane pliki z katalogów i${SOURCE}
aby${TARGET}
w ten sposób:źródło
Mam inny pomysł na zrobienie tego:
Możesz dopasować „FILEDETAIL ::” do wyniku polecenia. Możesz także zmienić ciąg „FILEDETAIL ::”. „% N” to nazwa pliku.
-r To mówi rsync, aby rekurencyjnie kopiowało katalogi.
-n To powoduje, że rsync wykonuje test, który nie wprowadza żadnych zmian.
źródło