Korzystając z systemu Ubuntu 12.04, chcę porównać 2 katalogi, powiedzmy folder1 / i folder2 / i skopiować wszystkie pliki inne niż folder3 /. Istnieją również pliki zagnieżdżone, więc należy również skopiować pasujące podkatalogi
Czy jest jedno polecenie, które by mi pomogło? Mogę uzyskać pełną listę zmienionych plików:
rsync -rcnC --out-format="%f" folder1/ folder2/
Ale rsync nie wydaje się mieć możliwości „eksportowania” tych plików do innego katalogu docelowego. Czy mogę potokować listę do cp lub innego programu, aby pliki były kopiowane, a katalogi również tworzone? Na przykład próbowałem
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
ale nie zachowałoby to również katalogów, po prostu skopiowałoby wszystkie pliki w folderze3 /
diff -qr
awk
rsync
rsync --include-from=FILE
opcji.Odpowiedzi:
Użyj --compare-dest.
Ze strony podręcznika:
najpierw sprawdź swoją składnię za pomocą --dry-run
Następnie, gdy jesteś zadowolony z wyników:
ten link ma dobre wyjaśnienie zakresu --compare-dest.
źródło
rsync -rcC --compare-dest=folder2/ folder1/ folder3/
rsync version 3.1.1 protocol version 31
na swoim lokalnym i rsync nie rozumie~/
ścieżek dla--compare-dest
param.--compare-dest
wymagała absolutnej ścieżki.fonts/Makefile.in
plik, który jest identyczny w obu katalogachfolder2
ifolder1
katalogach.Ten mały skrypt powinien działać:
Sądzę jednak, że lepszym rozwiązaniem byłoby parsowanie danych wyjściowych diff -qr, ponieważ konsekwentnie podaje ścieżkę i nazwę każdego pliku.
EDYTOWAĆ
To byłoby jedno polecenie, twoje polecenie zostało nieco zmodyfikowane. Ale stworzy
folder1
podfolder3
. I nie działa z pełnymi ścieżkami, ale także powyższy skrypt nie działa z pełnymi ścieżkami.Kiedyś
\"
wrsync
, aby pracować z plików i katalogów zawierających spacje. Testowane na Ubuntu 10.04. Mam nadzieję, że to pomoże.źródło
Jest to najprostsza forma, jaką mogę wymyślić, jeśli chcesz najpierw zejść
folder1
przed wydaniem polecenia.Jest to wolniejsza opcja, ale uważam, że spełnia twoje wymagania i może być wykonana przy użyciu nierelatywnych nazw katalogów:
Zostawiłem twój oryginał
rsync
polecenie w spokoju, ponieważ powiedziałeś, że daje ci poprawną listę plików (a moje pliki testowe są oczywiście inne niż twoje, więc nie mogłem powiedzieć na pewno, że dostanę prawidłową listę plików, jeśli popsuję z tym).grep
Jest tam, aby usunąć nazwy katalogów z wyjściarsync
.Dane wyjściowe
grep
są następnie przesyłane do innegorsync
za pomocąxargs
. W paramiefolder1/./{}
extra./
jest używane, aby rsync utworzył katalogi względne zaczynające się od./{}
, ignorującfolder1/
. Innymi słowy, unika tworzeniafolder3/folder1/
.Mogłem to przetestować tylko na CentOS 6.4, ale AFAIK powinien działać tak samo w Ubuntu 12.04.
EDYCJA: Powinienem zauważyć, że odpowiedź smithiana jest niewątpliwie lepsza, ale chciałem zrobić próbę wykonania tego
rsync
polecenia przy użyciu waszego oryginalnego polecenia, ponieważ dawało to pożądany efekt.źródło