Jakie są różnice między opcjami usuwania rsync?

118

Widzę na stronie podręcznika rsync, że istnieje wiele deleteopcji, ale tak naprawdę nie rozumiem różnic między nimi. Jakie są różnice między tymi opcjami?

 --del                   an alias for --delete-during
 --delete                delete extraneous files from dest dirs
 --delete-before         receiver deletes before transfer (default)
 --delete-during         receiver deletes during xfer, not before
 --delete-delay          find deletions during, delete after
 --delete-after          receiver deletes after transfer, not before
 --delete-excluded       also delete excluded files from dest dirs
Skilldrick
źródło
2
Dlaczego --delete-beforejest opisany jako (default)? Nie rozumiem, co (default)to znaczy.
Marco Marsala,
1
Nie jest już określony jako domyślny na manstronie dla rsync version 3.1.2 protocol version 31. Jednak przypuszczam, że wersja z cytowanym tekstem jest taka, że ​​jeśli używasz --deletezamiast --delete-WHEN, to tak, jakbyś określił, --delete-WHENgdzie WHENdomyślnie before.
Tom Hale

Odpowiedzi:

114
  • --del/--delete_during: Usuwa pliki z docelowego katalogu podczas ich kopiowania (oszczędza pamięć w porównaniu do --delete-before: --delete-beforewykonuje osobny skan w poszukiwaniu plików do usunięcia)

  • --delete: Usuwa pliki z katalogu docelowego, jeśli nie istnieją w katalogu źródłowym.

  • --delete-before: Usuń pliki z katalogu docelowego przed skopiowaniem pliku o tej samej nazwie z katalogu źródłowego

  • --delete-during: Usuń pliki w katalogu docelowym PODCZAS kopiowania pliku o tej samej nazwie z katalogu źródłowego

  • --delete-delay: Znak usuwa się podczas przesyłania, ale poczekaj, aż transfer zostanie zakończony

  • --delete-after: Odbiornik usuwa po przesłaniu, a nie przed ... Jeśli jakaś inna część rsync przeniosła dodatkowe pliki w inne miejsce, powinieneś tego chcieć --delete-delay, ponieważ --delete-delaydecyduje o tym, co ma zostać usunięte w trakcie przesyłania, podczas gdy --delete-aftersprawdza katalog w poszukiwaniu plików które należy usunąć PO zakończeniu.

  • --delete-excluded: Usuwa pliki z katalogu docelowego, które są wyraźnie wykluczone z przesyłania z katalogu źródłowego.

Chodzi o to, że rsync nie kopiuje, tylko archiwizuje. To ważne rozróżnienie. Przetwarzanie usuniętych / zmienionych plików ma kluczowe znaczenie, aw wielu przypadkach jest dopracowane.

W --deleteszczególności flaga jest tą, którą wiele razy spieprzyłem. Wiele osób używa rsync do przenoszenia plików do pamięci o niskim priorytecie, a w tym przypadku chcesz, aby pliki, które przenosisz, nadal istniały w katalogu docelowym. Nie robi tego usuwanie: --deleteupewnij się, że po usunięciu pliku z katalogu źródłowego zostanie on TAKŻE usunięty z katalogu docelowego, aby miejsce docelowe nie zapełniło się śmieciami. Raz widział, jak facet wymazuje swoją kopię zapasową wkładając nowy dysk i nie wyłączając jego nocnego skryptu rsync. Skrypt zauważył, że katalog źródłowy jest teraz pusty, i usunął każdy plik w katalogu docelowym, aby pasowały.

Większość innych opcji dotyczy przestrzeni lub wydajności. Gdy usuwasz pliki, ważne jest, aby upewnić się, że transfer się powiedzie, zanim cokolwiek zrobisz, ale jeśli twoje urządzenie jest zbyt małe, aby obsłużyć 2 kopie wszystkich informacji, musisz je usunąć w trakcie podróży itp. Jest to trochę zwariowany z powodu swojej długiej historii na wielu platformach: dodano pewne opcje, aby ludzie przyzwyczajeni do pewnych zachowań nie byli zdezorientowani.

Satanicpuppy
źródło
3
Czy więc --delete i --delete-before są takie same? man rsync nie mówi, kiedy --delete usuwa pliki.
ppr
@ppr: Zależy od systemu. Ma tak wiele konkretnych opcji, ponieważ usuwa w systemie Solaris! = Usuwa w systemie HP-UX! = Usuwa w systemie AIX! = Usuwa w systemie Linux.
Satanicpuppy
Czy rsynchronizując cały katalog, czy delete-afterusuwa każdy plik pomiędzy synchronizacją, czy tylko po dublowaniu całego katalogu ? Wydawało mi się, że delete-afterwystarcza na moje potrzeby, ale nie mam już miejsca na urządzeniu podczas tworzenia kopii zapasowej jednego z moich dysków.
Sridhar Sarnobat
1
@ Sridhar-Sarnobat: Albo. Porusza wszystko, co ma się poruszyć, a kiedy to zrobi, zaczyna kasować. Jeśli chcesz, aby został usunięty przed przeniesieniem wszystkiego, użyj --delete-during
Satanicpuppy
2
Po pewnym doświadczeniu stwierdzam, że nawet delete-duringnie zawsze temu zapobiega no space left on device(w Linuksie). delete-beforeJest to więc jedyny gwarantowany sposób na uniknięcie go (na przykład podczas tworzenia kopii lustrzanej dysku, który jest prawie pełny, a dysk docelowy jest prawie pełny).
Sridhar Sarnobat
1

Działają się dwie rzeczy:

  1. Kto usuwa?
  2. Kiedy to się zdarza

Zarówno nadawca, jak i odbiorca mogą otrzymać polecenie usunięcia (nie jestem pewien, dlaczego to ma znaczenie). Kiedy więc rsync z jednego komputera łączy się z serwerem rsync po drugiej stronie, określa to, kto faktycznie wydaje polecenie usuwania.

Kiedy to się dzieje, jest dość łatwe ... wcześniej oznacza, że ​​wszystkie pliki są usuwane, a NASTĘPNIE rsync kopiuje je. podczas gdy przegląda listę plików, usuwa je, gdy do nich dochodzi, a następnie oznacza, że ​​czeka, aż wszystkie pliki zostaną przesłane, a następnie usunie stronę zdalną. Ma to znaczenie tylko wtedy, gdy transfer zostanie przerwany.

Michael Pryor
źródło
Jestem prawie pewien, że żadna z tych opcji nie jest związana z usuwaniem rzeczy ze strony nadawcy . Wszystkie (AFAIK) dotyczą usuwania rzeczy ze strony odbiorcy . Mówisz też: „przed oznacza, że ​​wszystkie pliki są usuwane, a NASTĘPNIE rsync kopiuje pliki” - czy to prawda? Spodziewałbym --delete-beforesię usunąć tylko te pliki, które musiały zniknąć, nie wszystkie pliki! Ale wydaje mi się możliwe, że rsync usuwa wszystko, a następnie przesyła przez „nowe” (prawdopodobnie niezmienione) dane ...
Quuxplusone
1
Ach, „usuń ze strony nadawcy” jest obsługiwane przez rsync, ale nazwa tej opcji to --remove-source-files.
Quuxplusone
1

Inną kwestią, o której warto wspomnieć, jest to, że jeśli twój katalog źródłowy kończy się /*, to rsync weźmie pod uwagę tylko te pliki, a nie sam katalog (a zatem brak plików, które chcesz usunąć w miejscu docelowym).

Jeśli podasz opcję usuwania powyżej, ale rsync wygląda na to, że nie jest usuwana, sprawdź, czy nie przypadkowo globujesz i podajesz listę plików, gdy masz na myśli sam katalog.

Walt Stoneburner
źródło