Jak zrobić rsync, aby usunąć pliki, które zostały usunięte z folderu źródłowego?


194

Niedawno skonfigurowałem maszynę z Ubuntu Server do obsługi serwerów gier. Zainstalowałem wtyczkę kopii zapasowej dla każdego serwera gry, który tworzy częste kopie zapasowe plików świata gry w określonym folderze na komputerze. Ustanowiłem również cronzadanie automatycznego kopiowania tych kopii zapasowych do mojego folderu Dropbox co noc przy użyciu rsync z -aopcją.

Po kilku miesiącach moje konto Dropbox osiągnęło limit miejsca i zdałem sobie sprawę, że nie będę w stanie przechowywać tylu kopii zapasowych, więc skonfigurowałem wtyczkę kopii zapasowej serwera gier, aby nie zachowywała tylu kopii zapasowych, a potem zaczekałem kilka dni, aby sprawdzić, czy usuń starsze kopie zapasowe, tak jak zaplanowano to co tydzień. Wtyczka kopii zapasowej ostatecznie wykonała swoje zadanie i usunęła starsze kopie zapasowe, więc spodziewałem się, że rsynczadanie cron następnie usunie starsze kopie zapasowe z mojego folderu Dropbox, aby pasowały do ​​folderu źródłowego, ale tak się nie stało. Mam więc kilka pytań:

  • Domyślnie rsynctylko dodaje pliki do folderu docelowego, które zostały dodane do folderu źródłowego i zmienia pliki, które zostały zmienione w folderze źródłowym, ale NIE usuwa plików, które zostały usunięte z folderu źródłowego?

  • Jeśli tak jest, jaki jest najlepszy sposób, aby to rsynczrobić? Chcę, aby folder docelowy idealnie odzwierciedlał folder źródłowy, a to oznacza usuwanie wszystkich plików, które zostały usunięte z folderu źródłowego.

Widzę niektóre opcje wymienione na stronie podręcznika, rsyncktóre mogą załatwić sprawę, ale ponieważ nie jestem zaznajomiony.

Odpowiedzi:


227

Aby usunąć pliki w celu, dodaj --deleteopcję do polecenia. Na przykład:

rsync -avh source/ dest/ --delete

15
Upewnij się, że źródłem jest katalog. Korzystanie source/* dest/nie działa.
Tom Saleeba

3
Znalazłem to zdarzenie z --deletelub --delete-afternie można go usunąć z powodu niektórych błędów: „Wystąpił błąd we / wy - pomijanie usuwania pliku”. Aby rozwiązać tę --ignore-errorsopcję dodawania i osobno debugować błędy
MHT

12
Działa świetnie! Nawet jeśli działa, polecam ZAWSZE używać -n, --dry-runopcji przed uruchomieniem rsync, szczególnie jeśli chodzi o opcje takie jak te ( --delete). Pozwoli to uniknąć ewentualnego bólu głowy :).
ivanleoncz

2
@ MHT: Żadna odpowiedź nie wydaje się kompletna bez komentarza.
Lonnie Best

2
@ TheBicentennialMan -a implikuje -r .
x-yuri

45

Polecenie rsync nie usunie żadnego pliku, gdy użyjesz niektórych jego opcji deletew tym poleceniu. Więc jeśli jakikolwiek plik lub folder dodany w źródle, zostanie zsynchronizowany z celem bez usuwania.

Sugeruję, aby użyć rsyncdo wykonania kopii zapasowej z plików źródłowych i użyć find ... rmdo usunięcia plików na czas lub rozmiar plików:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

Powyższy blok kodu, wykonaj kopię zapasową ze źródła, a następnie usuń wszystkie pliki, których ostatnia modyfikacja trwa dłużej niż 2 miesiące.

AKTUALIZACJA

Ponieważ uważam, że deleteopcje są tylko dla TARGET, że jeśli niektóre pliki zostaną usunięte ze źródła, rsync --deleteusuń je z TARGET. I deleteopcja afteroraz before, jak wspomniano na stronie podręcznika :

--delete-before         receiver deletes before transfer, not during

Oznacza, że:

  1. rsync usuwa plik z TARGET, które są usuwane z SOURCE.
  2. rsync rozpoczyna synchronizację plików.

--delete-after receiver deletes after transfer, not during

Oznacza, że:

  1. rsync rozpoczyna synchronizację plików.
  2. rsync usuwa plik z TARGET, które są usuwane z SOURCE po synchronizacji.

UWAGA : --delete-{before/after}narzędzie tylko w TARGET.


1
Dziękuję za odpowiedź!! Czy masz na myśli opcję „usuń” dla rsync? Dlaczego nie mogę po prostu użyć opcji „usuń” dla rsync?
user254251

@ user254251, Jeśli używasz delete, polecenie rsync natychmiast usuwa pliki. Ale w tym przypadku jest więcej czasu na ewentualne błędy.
shgnInc

Jeśli dobrze rozumiem, mówisz, że powinienem oddzielić zadanie usuwania od zadania rsync, aby uniknąć błędów. Mam jednak pytanie. Strona podręcznika rsync zawiera listę opcji, które wydają się służyć rozdzieleniu zadania usuwania przez uruchomienie go przed lub po zadaniu kopiowania. Na przykład widzę dwie opcje o nazwach --delete-before i --delete-after. Czy rsync z tymi opcjami miałby taki sam efekt jak opisana metoda? Przeczytałem pełny opis każdej opcji na stronie podręcznika, ale w opisach jest kilka informacji, których nie rozumiem.
user254251

@ user254251, Odpowiedź została zaktualizowana. Nie wiem, czy istnieje sposób na usunięcie plików z TARGET poprzez ograniczenie czasowe w rsync .
shgnInc

Dzięki! Czy uważasz, że jestem bezpieczny przed błędami, jeśli po prostu użyję opcji --delete-before? Nie określam limitu czasu, więc nie powinienem się martwić, jeśli etap usuwania rsync opóźnia etap przesyłania. rsync uruchamia się raz dziennie i to dużo czasu, aby zsynchronizować pliki kopii zapasowej przed następną synchronizacją, więc nie powinienem też ograniczać czasu synchronizacji.
user254251

6

To polecenie skopiuje dane przyrostowe i zsynchronizuje je ze zdalnym serwerem.

  1. Skopiuje tylko dane przyrostowe.
  2. Zostanie usunięty, jeśli jakiekolwiek dane zostaną usunięte ze źródła.
  3. Skopiuje ponownie ze źródła, jeśli jakiekolwiek dane zostaną usunięte w miejscu docelowym.
  4. w zasadzie to polecenie utrzyma synchronizację obu środowisk.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Przykład:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
Myślę, że -W sprawia, że ​​nie kopiuje tylko danych przyrostowych, ale zawsze kopiuje całe pliki.
Tulains Córdova,

Wystąpił ten błąd, wykonując następujące polecenie: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

Jeśli są jakieś błędy podczas scync rsync rsync nie będzie prawidłowo usunąć pliki powinny mieć, nawet jeśli jest używana --delete, --delete-afterlub --delete-before.

Dlatego ważne jest, aby rozwiązać błędy rsync.

Większość moich błędów była spowodowana użyciem --permsopcji podczas synchronizacji z systemem plików innym niż Linux. Kiedy otrzymuje --permssię --no-permste błędy odszedł, a następnie usuwanie pracował.

--permsjest ok, gdy synchronizujesz z systemu plików Linux do innego systemu plików Linux, ale jeśli synchronizujesz z systemu Linux do systemu plików innego niż Linux (np. NTFS, FAT), --permspowoduje błędy, ponieważ rsync nie może ustawić uprawnień Linux na systemy plików inne niż Linux . Znów błędy = brak usuwania.

- Podczas synchronizowania na partycję dla Linuksa, używam --no-perms, aby uniknąć tych błędów, które sabotaż --delete, --delete-afteralbo --delete-before.

Jeśli nadal występują błędy i nie możesz dowiedzieć się, jak je naprawić, możesz uruchomić polecenie, które jest przeznaczone wyłącznie do usuwania plików niezsynchronizowanych:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

Powyższe polecenie usunie elementy niezsynchronizowane, ale nie zsynchronizuje żadnych plików. Po tym powinieneś ponownie zsynchronizować. To polecenie opiera się na tej odpowiedzi , z tym wyjątkiem, że dodałem --ignore-errorsrównież argument, więc zostałby usunięty nawet w przypadku wystąpienia błędów.


1
Dzięki za wskazówkę! Jestem oryginalnym autorem tego pytania 5 lat temu. Bardzo się cieszę, że to opublikowałeś, ponieważ w najbliższej przyszłości planowałem synchronizację z dyskiem NTFS i prawdopodobnie napotkałbym błąd uprawnień, ponieważ planowałem użyć opcji „-a” dla rsync, który synchronizuje uprawnienia (między innymi). Dodałem więc „--no-perms” do moich notatek. Planuję teraz użyć rsync -a --no-perms --delete-before. Mam pytanie: Czy - nie usunęłbym przed usunięciem problemów z usunięciem pliku, uruchamiając usuwanie przed synchronizacją? To był jej cel.
user254251

@ user254251 - Nie jestem pewien. Myślę, że to zależy od tego, jak wcześnie tak naprawdę „usuwa się przed”. Jeśli w jakiś sposób napotka jeden błąd przed rozpoczęciem usuwania, to wkręciłeś. Radzę ci unikać NTFS w każdej chwili, chyba że lubisz ostre bóle w dupie :). NTFS do NTFS działa dobrze. NTFS do Linix działa dobrze. Unikaj „systemu plików Linux” na „system plików inny niż Linux”; jest to zbyt duży problem, aby zapewnić prawidłowe usuwanie. Możesz to zrobić, ale zdecydowałem, że nie jest to warte kłopotów w porównaniu do sformatowania dysku docelowego jako EXT4.
Lonnie Best
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.