Rsync - opcja usuwania nie usuwa plików z katalogu docelowego

14

Próbuję użyć --deleteopcji w, rsyncaby usunąć pliki w katalogu docelowym, który nie jest obecny w oryginalnym katalogu

Oto polecenie, którego używam:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Więc moje pytanie brzmi: jak mogę usunąć wszystkie pliki z katalogu docelowego, których nie ma w oryginalnym katalogu?

użytkownik2028856
źródło

Odpowiedzi:

14

Użyj tego polecenia:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Nie potrzebujesz znaku „*” i nie powinieneś go również używać.

Aby wykluczyć / dołączyć pliki lub katalogi, powinieneś użyć tych parametrów:

--exclude 'to_exclude*'
--include 'to_include*'
AB
źródło
Okej, pozwól mi spróbować :)
user2028856 16.04.15
2
Czy więc „*” powoduje, że polecenie --delete nie działa?
user2028856
2
Tak to wygląda. :)
AB
3
--recursivejest nadmiar, ponieważ opcja -ajuż go zawiera
Temak
1
W niektórych przypadkach „*” może być ważne, ponieważ wyklucza pliki / katalogi zaczynające się od „.”. Na przykład używam go, gdy używam rsync do kopiowania katalogu obsługiwanego przez git z maszyny programistycznej na maszynę produkcyjną. Nie chcę synchronizować katalogu repozytorium .git ani plików takich jak .gitignore, tylko działające drzewo, w tym pliki na najwyższym poziomie, a także podkatalogi.
sootsnoot
14

Twoje polecenie nie działało, ponieważ gdy używasz go /var/www/*jako źródła, twoja powłoka wykonuje na nim globbing, tzn. Powłoka się rozwija* do wszystkich plików w tym katalogu i kopiuje pliki jeden po drugim, więc tutaj pojedyncze pliki stały się źródłami, a nie katalog nadrzędny.

Tak więc, jeśli używasz /var/www/*, nie potrzebujesz --recursiveopcji, ponieważ *spowoduje to skopiowanie plików (wraz z dowolnymi katalogami z ich zawartością), a nie katalogu nadrzędnego zawierającego pliki. Z tego samego powodu --deletenie działa, ponieważ --deleteusunie pliki z katalogu docelowego , które nie znajdują się w katalogu źródłowym , ale kopiujesz pliki, więc nie usuwa plików (prawdopodobnie).

Dzięki temu będziesz bardziej zrozumiały:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

Jak widać, użyłem źródła, ponieważ /foo/*stąd rsyncwykonywane jest polecenie

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

z *tworzeniem powłoki w celu jej rozszerzenia i tworzenia wszystkich plików osobno jako argumentów źródłowych, a nie katalogu nadrzędnego jako całości ( --recursivew tym przypadku również nie potrzebujesz ).

Jeśli więc chcesz --deletepracować, uruchom go jako:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/
heemayl
źródło
4
Doskonałe wyjaśnienie wskazujące na prawdziwy problem: użycie „*” do rozwinięcia listy źródeł.
Antonio Bardazzi
Jak zauważono w moim komentarzu do zaakceptowanej odpowiedzi, * może być użyteczny do wykluczenia rzeczy takich jak pliki i katalogi zaczynające się od „.”. Chociaż, jak zauważasz, oznacza to, że pliki i katalogi usunięte z najwyższego poziomu w źródle nie zostaną usunięte z katalogu docelowego. Dla mnie nie obchodzi, czy pliki najwyższego poziomu zostaną poprawnie usunięte z miejsca docelowego, tylko pliki poniżej podkatalogów mają znaczenie. Usunięcie podkatalogu najwyższego poziomu jest znacznie mniej prawdopodobne niż dodanie jednego i jestem gotów wykonać ręczne rm -r na miejscu docelowym w tak mało prawdopodobnym przypadku.
sootsnoot