rsync „nie może usunąć niepustych katalogów”, nawet z opcją --force

28

Podczas uruchamiania tego polecenia:

$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/

Otrzymuję następujące dane wyjściowe:

cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor

Po przeczytaniu man rsyncmiałem wrażenie, że --forceopcja kazała rsync usunąć te niepuste katalogi, co jest pożądanym rezultatem.

Ref:

--force                 force deletion of dirs even if not empty

Jak mogę zmodyfikować polecenie, aby usunąć niepuste katalogi?

Używam rsync w wersji 3.0.8, w Gentoo Base System w wersji 2.0.3, na wypadek, gdyby było to istotne.

Aktualizacja: Dodano sudodo polecenia, aby wyjaśnić, że nie jest to problem z uprawnieniami do plików.

tommarshall
źródło
Jaki system plików jest miejscem docelowym? Czy system plików wymaga naprawy?
Marcus Downing
System plików to ext3. Możliwe, że system plików może być potrzebny lub naprawiony. Będę fsckprzy najbliższej okazji i aktualizacji z wynikami.
tommarshall
Właśnie fsckuruchomiłem system i ten problem jest nadal obecny.
tommarshall

Odpowiedzi:

39

Próbowałeś dodać --delete-excluded?

Jeśli usuniesz katalog w wykluczonych folderach po „zdalnej” stronie, rsync --deletenie usuniesz wykluczonego folderu w „lokalnej” witrynie.

Martin Höger
źródło
Tam folder o nazwie uploadsw html/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_samplesi html/js/ckeditor/plugins/uicolor/yuikatalogów. Dzięki za pomoc.
tommarshall
jeśli używasz, --delete-excludedale nadal chcesz wykluczyć niektóre pliki / katalogi z usunięcia, możesz umieścić ten plik / katalog w --filter 'protect some_dir/', na przykład:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
alexandre1985
6

Oto możliwe źródła tego problemu:

(1) Ten błąd może wynikać z opcji -b (--backup). Ta opcja utworzy kopię zapasową każdego usuniętego pliku, dodając tyldę ( ~ ) w nazwie pliku. (To mnie pomyliło, ponieważ nazwa pliku jest wyraźnie kopią zapasową, ale nazwa katalogu nie jest, ponieważ tylda nie jest widoczna).

Aby sprawdzić, czy jest to ten sam przypadek, przeczytaj katalog docelowy na najgłębszym poziomie i sprawdź, czy istnieje plik końcowy tyldy (~). Zauważ, że te nazwy dołączonych tyldy są wtedy niewidoczne w niektórych popularnych systemach przeglądania plików, więc możesz ich nie zobaczyć.

Aby rozwiązać ten przypadek, wybierz opcję --backup-dir = DIR, na przykład --backup-dir = .rsync_bak.

(2) Opcja --exclude może mieć takie same wyniki. Co prawdopodobnie dzieje się w twoim przypadku. System wzorów jest potężny, ale może wprowadzać w błąd. Na przykład, jeśli napiszesz --exclude = '* ~', spowoduje to pominięcie wszystkich plików kończących tyldę, dając wynik dokładnie taki sam jak w przypadku (1) powyżej.

ze strony man rsync:

jeśli wzorzec zaczyna się od a, to jest zakotwiczony w określonym miejscu w hierarchii plików, w przeciwnym razie jest dopasowywany do końca nazwy ścieżki

Jeśli napiszesz --exclude = uploads, spowoduje to wykluczenie wszystkich plików o nazwie „updloads” na dowolnym poziomie drzewa plików.

Sprawdź, czy w twoich niemożliwych do usunięcia katalogach znajduje się plik o nazwie „uploads”.

Rozwiązaniem byłoby zmienić „--exclude = uploads” na „--exclude = uploads /”

użytkownik3586623
źródło
0

W mojej konfiguracji ((źródło to Ubuntu format typu ext4, aby celować w fuseblk typu Western Digital) działa z:

rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded  --exclude='*~'  --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD
InLaw
źródło
2
Która część faktycznie rozwiązuje problem?
Michael Hampton
0

Zamiast reguł używaj reguł w plikach filtrów --exclude. Pozwalają one oznaczać wykluczenia jako „trwałe”, co pozwala usuwać niepuste katalogi zawierające wykluczone pliki.

Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.

mivk
źródło
-1

Katalog musi być pusty, aby można go było usunąć, zwykle wymaga tego system plików.

Dlatego normalnie rsynclub rmrekurencyjnie najpierw usuwa całą zawartość, a dopiero potem usuwa teraz pusty katalog.

Jeśli bieżący użytkownik nie jest właścicielem wszystkich plików, uprawnienia systemów plików nie pozwolą na usunięcie tych plików. Ponieważ nie zostaną one usunięte, katalog nie zostanie opróżniony, a usunięcie nie powiedzie się.

Najpierw sądzę, że niektóre pliki w tym katalogu są własnością innego użytkownika, np. Apache lub nikt.

HBruijn
źródło
Dzięki. Pliki w katalogach są rzeczywiście własnością użytkownika w grupie apache, jednak właśnie próbowałem uruchomić to polecenie jako ten użytkownik i dostałem te same błędy.
tommarshall
Ponadto, jeśli byłby to problem z uprawnieniami do plików, oczekiwałbym uruchomienia tego samego polecenia, co w przypadku „sudo”, aby rozwiązać problem, ale tak nie jest. Jeśli jednak się mylę, proszę mnie poprawić.
tommarshall
1
Uruchomienie polecenia jako root powinno rozwiązać większość problemów z uprawnieniami, tak. (prawdopodobnie miejsce, w którym to nadal by się nie powiodło, znajduje się na gnieździe NFS, aby wymienić jeden, niezmienny plik inny). Wystarczy sprawdzić, czy ls -lakatalog nie jest pusty. lsattrwyświetli niezmienne pliki.
HBruijn
Dzięki za dodatkowe informacje, jednak lsattrz jednego z wymienionych katalogów wyprowadza następujące informacje: --------------- ./assets(brak flagi i), a plik nie jest zamontowany w systemie plików NFS. Czy są jeszcze inne powody, dla których moglibyście pomyśleć, dlaczego polecenie nadal nie działa w Sudo?
tommarshall
Czy są tam jakieś dowiązania symboliczne, czy tylko prawdziwe pliki?
Marcus Downing