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 rsync
miałem wrażenie, że --force
opcja 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 sudo
do polecenia, aby wyjaśnić, że nie jest to problem z uprawnieniami do plików.
ext3
. Możliwe, że system plików może być potrzebny lub naprawiony. Będęfsck
przy najbliższej okazji i aktualizacji z wynikami.fsck
uruchomiłem system i ten problem jest nadal obecny.Odpowiedzi:
Próbowałeś dodać
--delete-excluded
?Jeśli usuniesz katalog w wykluczonych folderach po „zdalnej” stronie,
rsync --delete
nie usuniesz wykluczonego folderu w „lokalnej” witrynie.źródło
uploads
whtml/js/ckeditor/_source/plugins/uicolor/yui
,html/js/ckeditor/_samples
ihtml/js/ckeditor/plugins/uicolor/yui
katalogów. Dzięki za pomoc.--delete-excluded
ale 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/
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 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 /”
źródło
W mojej konfiguracji ((źródło to Ubuntu format typu ext4, aby celować w fuseblk typu Western Digital) działa z:
źródło
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.
źródło
Katalog musi być pusty, aby można go było usunąć, zwykle wymaga tego system plików.
Dlatego normalnie
rsync
lubrm
rekurencyjnie 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.
źródło
ls -la
katalog nie jest pusty.lsattr
wyświetli niezmienne pliki.lsattr
z 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?