2010-06-25 12:29:20 +0000 2010-06-25 12:29:20 +0000
126
126

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

Widzę na stronie rsync man page , że istnieje wiele opcji delete, ale nie bardzo rozumiem różnice 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

Odpowiedzi (4)

125
125
125
2010-06-25 14:19:55 +0000
  • --del/--delete_during: Usuwa pliki z docelowego dir podczas kopiowania (oszczędza pamięć w porównaniu do --delete-before: --delete-before wykonuje osobne skanowanie w poszukiwaniu plików do usunięcia)

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

  • --delete-before: Usuwa pliki w katalogu docelowym przed skopiowaniem file-with-same-name z katalogu źródłowego

  • --delete-during: Usuwaj pliki w katalogu docelowym W TRAKCIE kopiowania pliku o tej samej nazwie z katalogu źródłowego

  • --delete-delay: Mark kasuje podczas transferu, ale czeka aż transfer się zakończy

  • --delete-after: Receiver deletes after transfer, not before… Jeśli jakaś inna część rsync przeniosła dodatkowe pliki gdzie indziej, chciałbyś to zamiast --delete-delay, ponieważ --delete-delay decyduje co usunie w środku transferu, podczas gdy --delete-after sprawdza katalog pod kątem plików, które powinny być usunięte PO zakończeniu wszystkiego.

  • --delete-excluded: Usuwa pliki z katalogu docelowego, które są jawnie wykluczone z transferu z katalogu źródłowego.

Celem rsync nie jest kopiowanie, lecz archiwizacja. Jest to ważne rozróżnienie. Przetwarzanie usuniętych/zmienionych plików jest krytyczne, a w wielu przypadkach niuansowe.

W szczególności flaga --delete jest jedną z tych, które widziałem wiele razy spieprzone. Wiele osób używa rsync do przenoszenia plików do pamięci masowej o niskim priorytecie, a w tym przypadku chcesz, aby pliki, które przenosisz nadal ISTNIAŁY w katalogu docelowym. To nie jest to, co robi delete: --delete upewnia się, że kiedy usuwasz plik z katalogu źródłowego, jest on również usuwany z katalogu docelowego, więc miejsce docelowe nie jest pełne śmieci… Kiedyś widziałem, jak facet wymazał swoją kopię zapasową, wkładając nowy dysk i nie wyłączając nocnego skryptu rsync. Skrypt zobaczył, że katalog źródłowy jest teraz pusty i usunął każdy plik w katalogu docelowym, aby się zgadzały.

Większość innych opcji jest związana z przestrzenią lub wydajnością. Kiedy usuwasz pliki jest ważne, jeśli chcesz się upewnić, że transfer jest udany, zanim cokolwiek zrobisz, ale jeśli twoje urządzenie jest zbyt małe, aby obsłużyć 2 kopie wszystkich informacji, musisz usuwać w trakcie pracy itp. Jest trochę zawadiacki ze względu na swoją długą historię na wielu platformach: niektóre opcje zostały dodane, aby ludzie, którzy byli przyzwyczajeni do pewnych zachowań, nie byli zdezorientowani.

2
2
2
2013-01-17 18:50:20 +0000

Innym punktem wartym wspomnienia jest to, że jeśli katalog źródłowy kończy się /*, to rsync weźmie pod uwagę tylko te pliki, a nie sam katalog (a więc brak plików, które chcesz usunąć w miejscu docelowym).

Jeśli określasz opcję usuwania powyżej, ale rsync wygląda na to, że nie usuwa, sprawdź, czy przypadkiem nie globalizujesz i nie podajesz listy plików, gdy masz na myśli sam katalog.

2
2
2
2010-06-25 12:57:07 +0000

Dzieją się dwie rzeczy:

  1. Kto wykonuje kasowanie
  2. Kiedy to się dzieje

Albo nadawca, albo odbiorca może zostać poinstruowany, aby wykonać usuwanie (nie jestem pewien, dlaczego to ma znaczenie). Więc kiedy rsync z jednego komputera łączy się z serwerem rsync po drugiej stronie, określa to, kto faktycznie wydaje polecenie usunięcia.

Kiedy to się dzieje jest dość proste… przed oznacza, że wszystkie pliki są usuwane, a następnie rsync kopiuje pliki. podczas oznacza, że przechodząc przez listę plików, usuwa je, gdy do nich dojdzie, a po oznacza, że czeka, aż wszystkie pliki zostaną przesłane, a następnie usuwa zdalną stronę. Ma to znaczenie tylko wtedy, gdy transfer zostanie przerwany.

0
0
0
2019-12-31 14:32:28 +0000

Domyślnie rsync nie usuwa żadnych plików po stronie docelowej. Aby rsync mógł w ogóle usuwać pliki, musisz użyć przynajmniej jednej z opcji usuwania.

Jeśli nie obchodzi cię, kiedy pliki są usuwane, po prostu użyj --delete i pozostaw wybór rsync. Możesz połączyć --delete z innymi opcjami kasowania (nie powoduje to konfliktu), ale nie musisz, ponieważ wszystkie inne opcje kasowania już implikują --delete.

--delete-before działa w następujący sposób: rsync patrzy, które pliki są obecne w źródle i które pliki są obecne w miejscu docelowym, usuwa wszystkie pliki znalezione w miejscu docelowym, ale nie w źródle, a następnie rozpoczyna właściwą synchronizację. Ta kolejność jest przydatna, jeśli miejsce docelowe ma mało miejsca, ponieważ najpierw zwolni więcej miejsca na dysku w miejscu docelowym przed rozpoczęciem przesyłania nowych plików. Minusem jest to, że rsync będzie wymagał więcej pamięci do wykonania operacji i cała operacja jest procesem dwuetapowym, a więc wolniejszym.

--delete-during działa w następujący sposób: rsync natychmiast zaczyna synchronizować pliki i gdy natrafi na plik, który istnieje tylko w miejscu docelowym, jest on usuwany. W ten sposób nie ma kary za prędkość, a także nie jest wymagana dodatkowa pamięć. Minusem jest to, że może się zdarzyć, że najpierw wiele nowych plików jest kopiowanych do miejsc docelowych, zanim usunięte pliki zostaną usunięte, więc miejsce docelowe może wymagać znacznie więcej miejsca na dysku podczas operacji, niż wymaga na końcu, gdy cała operacja jest zakończona.

--delete-after działa w następujący sposób: Najpierw zsynchronizuj wszystkie pliki, a następnie wykonaj tę samą operację, którą --delete-before wykonuje przed fazą synchronizacji. Jest to najgorszy wybór w większości przypadków, ponieważ wymaga najwięcej pamięci, najwięcej miejsca na dysku w miejscu docelowym i jest wolniejszy, ponieważ jest to proces dwuetapowy; w zasadzie łączy w sobie wszystkie wady pozostałych dwóch metod. Ta opcja istnieje głównie dla przypadku, gdy używasz “merge files” (czym są pliki scalające i jak działają, jest poza zakresem tej odpowiedzi). Ponieważ te pliki mogą zawierać reguły dla plików, które mają być wykluczone podczas usuwania, nowe pliki scalania muszą być skopiowane przed fazą usuwania, jeśli ich zawartość ma być brana pod uwagę podczas fazy usuwania. O ile nie jest to wymóg, --delete-after nie ma żadnej przewagi.

--delete-delay jest dość nową opcją (nie jest dostępna w rsync 2.6.9, która nadal jest domyślna np. w macOS 10.15). Działa podobnie jak --delete-during, z tą różnicą, że nie będzie usuwać plików od razu, ale po wykonaniu synchronizacji, jest więc hybrydą --delete-during i --delete-after. Zaletą jest to, że jest szybszy niż --delete-after, wadą jest to, że wymaga więcej pamięci podczas synchronizacji.

--delete-excluded mówi rsync, aby nie tylko usuwał pliki, których brakuje w źródle, ale także usuwał pliki w miejscu docelowym, które zostały wykluczone z synchronizacji (--exclude lub --exclude-from), niezależnie od tego, czy te pliki faktycznie istniałyby w źródle, czy nie.