Poprosić rsync o usunięcie plików po stronie odbiorczej, które nie istnieją po stronie wysyłającej, z wyjątkami po stronie odbierającej

29

Przeczytałem te wątki:

Ale, o ile mogę powiedzieć (może coś mi brakuje), nie obejmują one następującego pytania:

Jak poprosić rsynco skopiowanie plików i usunięcie tych po stronie odbiorczej, które nie istnieją po stronie wysyłającej, z wyjątkami? (np. nie usuwaj repozytorium rtęci .hgpo stronie odbierającej, nawet jeśli nie ma repozytorium po stronie wysyłającej).

Jedna możliwość?

Pożyczanie od odpowiedzi @Richard Holloway poniżej. Powiedz, że mam następujący wiersz:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

O ile rozumiem, ten wiersz spowodowałby rsyncusunięcie wszystkiego na ścieżce odbiorczej, która nie istnieje na ścieżce wysyłającej, z wyjątkiem tych pasujących dont_delete_me. Moje pytanie brzmi: czy rsync zachowa pliki po stronie odbierającej, które są dopasowane, dont_delete_me nawet jeśli nic po stronie wysyłającej nie pasuje dont_delete_me?

Amelio Vazquez-Reina
źródło

Odpowiedzi:

33

Jeśli użyjesz --deletei --excluderazem to, co znajduje się w wykluczonej lokalizacji, nie zostanie usunięte, nawet jeśli pliki źródłowe zostaną usunięte.

Ale to rodzi problem, że folder nie będzie rsyncwcale. Będziesz potrzebował innej rsyncpracy do synctego folderu.

Na przykład.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Można je uruchomić na odwrót, ale spowoduje to usunięcie wszystkich usuniętych plików, a następnie ich zastąpienie, co nie jest tak wydajne.

Nie możesz tego zrobić jako jednej wkładki.

Richard Holloway
źródło
Dzięki @Richard. Twoja odpowiedź każe mi myśleć, że moje pierwotne pytanie mogło być łatwiejsze niż myślałem. Jeśli użyję pojedynczej linii: rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathczy nie spowodowałoby to rsyncusunięcia wszystkiego na ścieżce odbiorczej, która nie istnieje na ścieżce wysyłającej, z wyjątkiem rzeczy pasujących dont_delete_me? Co najważniejsze, czy rsyncrzeczy po stronie odbiorcy byłyby dopasowane, dont_delete_me nawet jeśli nic po stronie wysyłającej nie pasujedont_delete_me ? Jeśli tak jest, myślę, że to jedyna linia, której potrzebuję, prawda?
Amelio Vazquez-Reina,
Masz rację, ale nie otrzymasz nowych plików i zmian w folderze dont_delete_me, jeśli zrobisz to w jednym wierszu. Jeśli nie chcesz synchronizować zmian i dodatków, możesz po prostu użyć flagi --exclude, jak opisano tutaj.
Richard Holloway,
@AmV Wykluczone pliki nie są usuwane przez --delete, chyba że wyraźnie to określisz --delete-excluded. Zobacz opis --deleteiw --delete-excludedpodręczniku rsync.
Gilles 'SO - przestań być zły'
4

Odkryłem, że następujące rozwiązanie działa dla moich celów:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Uwaga: Dodaj -nopcję wykonania suchego biegu i nie zmieniaj --deletena --delete-excluded!)

Uruchomienie polecenia powoduje następujące właściwości:

  • Katalog źródłowy srcpozostaje niezmodyfikowany
  • destFolder docelowy pasuje do folderu źródłowego, z tą różnicą, że:

    • pozycje na do_not_send_to_destliście nie są wysyłane do miejsca docelowego, oraz
    • pozycje na do_not_modify_in_destliście pozostają niezmodyfikowane w miejscu docelowym.
  • (Uwaga: nie ma problemu, aby nieistniejące elementy były wymienione w jednym z do_not_plików „ ”).

Wyjaśnienie

--deleteWydaje mi się, że kiedy rsync odczytuje argumenty wiersza poleceń od lewej do prawej, wydaje się , że argument ten powoduje, że rsync wewnętrznie „przełącza tryby” (w pewnym sensie), umożliwiając --exclude-fromponowne użycie opcji ponownie, ale o innym znaczeniu.

Zastrzeżenie:

  • Jeśli element na do_not_send_to_destliście już istnieje w miejscu docelowym, to:

    • to polecenie nie usuwa tego elementu z miejsca docelowego (chyba że element zostanie najpierw usunięty z katalogu źródłowego)
    • Uwaga: zmiana --deletena --delete-excludedspowoduje usunięcie wszystkiego w miejscu docelowym wymienionym na jednej z dwóch list. xD (Być może rsync został napisany jako otwarty / elastyczny, ale ma pewne niuanse?)

Lekko przetestowane pod kątem użytkowania.

Używam „ rsync version 3.0.9 protocol version 30”.

użytkownik2533809
źródło