Chciałbym użyć rsync do ...
- usuń pliki po stronie odbierającej, które zostały również usunięte po stronie wysyłającej
- nie usuwaj innych plików, które znajdują się w katalogu rsynced po stronie odbierającej
Załóżmy na przykład, że mam katalog local-src
:
PRZED: local-src
lokalnie zawiera ...
a.txt
b.txt
c.txt
local-src
nazywany jest mój zdalny katalog, który chciałbym zsynchronizować z zawartością remote-src
.
PRZED: remote-src
zdalnie zawiera ...
a.txt
b.txt
c.txt
d.txt
README.md
Powiedzmy, że usuwam niektóre pliki w local-src
:
PO USUNIĘCIU LOKALNYM: local-src
lokalnie zawiera ...
c.txt
Jak mogę użyć rsync w taki sposób, aby pliki usunięte u źródła zostały również usunięte w miejscu docelowym, ale bez usuwania innych plików w miejscu docelowym. Na przykład chciałbym mieć następujące miejsca docelowe:
PO USUNIĘCIU LOKALNYM: remote-src
zdalnie zawiera ...
c.txt
d.txt
README.md
Oznacza to, a.txt
i b.txt
są zdalnie usunięte, jak również, ale d.txt
i README.txt
są pozostawione same.
Czy jest jakiś sposób na osiągnięcie tego za pomocą rsync?
EDYCJA: Wydaje się, że werdykt może być niemożliwy w przypadku rsync. Zapytano mnie, dlaczego potrzebuję tego, aby zilustrować mój przypadek użycia:
Powiedzmy, że mam serwer internetowy. Na tym serwerze mam kilka katalogów, powiedzmy, że mam katalog A
i public_html
katalog, z którego obsługiwana jest moja strona. Powiedzmy, że mam zautomatyzowany proces, który tworzy pliki w katalogu A
. Chciałbym rsync (lub synchronizacja za pomocą innego narzędzia) pliki wygenerowane lub aktualizowane w A
do public_html
katalogu, nie usuwając innych dowolnych plików, które mogą być w zasięgu public_html
. Z pewnością nie chcę, aby rsync przypadkowo usunął moją witrynę.
Jeśli rsync nie jest narzędziem do tego zadania, czy ktoś inny wie, jak to zrobić?
rsync
ponieważ nie ma sposobu, aby dowiedzieć się, które pliki znajdują się już w folderze zdalnym. Może być konieczne znalezienie innego narzędzia.Odpowiedzi:
To, co chcesz zrobić, jest rozsądne, ale korzystanie
rsync
z niego samodzielnie nie jest. Więc odpowiedź brzmi nie .Powód jest prosty:
rsync
nie przechowuje historii tego, co było w każdym katalogu i nie ma możliwości dowiedzenia się, co należy usunąć, a co nie. Nie bez dodatkowego wsparcia.Powinieneś zadać sobie pytanie, dlaczego lubisz to robić
rsync
i wyjaśnić. Istnieją inne programy,librsync1.so
które są bardziej inteligentne.Dzięki łagodnym ograniczeniom, których nie potrzebujesz
rsync
, możesz rzucić okiem na rdiff-backup :To pokazuje
xx
iyy
są wb
.To pokazuje
xx
izz
są wb
.rdiff-backup
również utrzymuje katalogrdiff-backup-data
wb
tak można cofnąć wszystkie zmiany, należy oczyścić to regularnie, używającrdiff-backup
polecenia. (Przykładem są pliki lokalne pokazujące, że dodatkowe dane w celu nie zostaną usunięte, ale rdiff-backup działa również przez sieć).Inną alternatywą jest skonfigurowanie rozproszonego systemu kontroli wersji (mercurial, bazar, git). Z mercurial np. Możesz mieć skrypt (używam do tego Makefile), który wypycha wszystkie zmiany na serwer, a następnie dokonuje aktualizacji pobranych plików, ignoruje wszelkie dodatkowe pliki, które znajdują się na zdalnym serwerze (ale mają nie poddano kontroli wersji).
Na serwerze zrobiłbyś:
Na kliencie:
Teraz, jeśli usuniesz plik na kliencie i wykonasz:
Usunięty plik zostanie usunięty na serwerze, ale żadne inne dane (nie dodane do repozytorium) nie zostaną usunięte.
źródło
A
, w którym proces jest zautomatyzowany, a pliki są tam generowane automatycznie. Mam serwer sieciowy i chciałbym, aby znajdujące się w nim plikiA
zostały zsynchronizowane zpublic_html
katalogiem serwera, oczywiście bez usuwania wszystkiego innego wpublic_html
folderze serwera. Jeśli ktoś ma jakieś pomysły na osiągnięcie tego za pomocą innego narzędzia, byłoby to mile widziane. Zaktualizuję moje pytanie, aby to odzwierciedlić.local-src
katalogu, bez konieczności obserwowania zmian w tym katalogu. Może to byłoby trudne.rsync
nie jest narzędziem. Należy mieć świadomość, żesync
wrsync
pochodzi z synchronizacji i to nie jest dokładnie to, co chcesz zrobić. W rozwojursync
skupiono się na wydajnym (minimalizowaniu) przekazywaniu danych. Inne narzędzia, takie jakrdiff-backup
(i możliwecvsup
), wykorzystały do tego swoje techniki, ale wykorzystują dodatkowe funkcje.Nie sądzę, że jest to możliwe bez jawnego wykluczenia plików po stronie odbierającej jako części polecenia rsync. Zobacz sekcję strony podręcznika dla rsync: „ZASADY I USUŃ DLA KATALOGU”.
źródło
Jeśli dobrze zrozumiałem,
--exclude
być może tego szukasz:źródło
Mam na to odpowiedź. Myślę, że to działa. I to działa dla mnie. Najpierw musisz
rsync
zdalnie przesłać pliki do plików lokalnych. Następnie strona lokalna zawiera wszystkie pliki.teraz po stronie lokalnej
Następnie możesz usunąć pliki lub zrobić co chcesz. (Po stronie lokalnej). W swoim pytaniu usuwasz te pliki.
usunięte pliki
Następnie możesz
rsync
przenieść pliki lokalne na stronę zdalną, a następnie obie strony mają te same pliki.to daje
pliki po stronie zdalnej i po stronie lokalnej (przy użyciu
--delete
usuwa inne pliki po stronie zdalnej , które nie są zgodne ze stroną lokalną ).źródło