rsync nie może usunąć niepustego katalogu


10

Podczas synchronizacji mojej zdalnej kopii zapasowej pojawia się błąd rsync cannot delete non-empty directory.

Znam przyczynę: wykluczyłem niektóre pliki, a gdy rsync próbuje usunąć katalog zdalny, ponieważ nie istnieje on lokalnie, nie może, ponieważ nie jest pusty. Bez wykluczenia katalog zostałby opróżniony.

Wiem też, że mogłem pozbyć się problemu, używając opcji --delete-wykluczone, ale nie chcę tego chcę.

Chciałbym pominąć przesyłanie niektórych plików (ponieważ są one zbyt duże dla mojej prędkości przesyłania), ale chcę zachować te, które już przesłałem jakiś czas temu, jeśli istnieją lokalnie . Jeśli nie istnieją lokalnie, należy je usunąć. - wykluczone usunie je wszystkie po stronie zdalnej.

Oznacza to również, że jeśli katalog już nie istnieje lokalnie, należy go usunąć, nawet jeśli zawiera wykluczone pliki.

Czy można to skonfigurować rsync?

Odpowiedzi:


5

Użyj pmodyfikatora:

Litera p oznacza, że ​​reguła łatwo psuje się, co oznacza, że ​​jest ignorowana w usuwanych katalogach. Na przykład domyślne reguły opcji -C wykluczające rzeczy takie jak „CVS” i „* .o” są oznaczone jako łatwo psujące się i nie zapobiegną usunięciu katalogu usuniętego ze źródła w miejscu docelowym.

Na przykład korzystam z -Fopcji, która „każe rsync szukać plików .rsync-filter dla poszczególnych katalogów, które zostały posypane przez hierarchię i używać ich reguł do filtrowania plików podczas przesyłania”.

Moje .rsync-filterzawiera takie wiersze, aby odfiltrować te „odchody” pozostawione przez komputery Mac:

-p .DS_Store
-p ._*

Jeśli używasz excludezamiast po prostu -dodaj przecinek. Na przykład :

exclude,p .DS_Store
exclude,p Thumbs.db

0

Możesz użyć modyfikatorów wzorca włączania / wykluczania, dodawania -s użytego wzorca. Mówi rsync, że wyklucza regułę tylko po stronie wysyłającej.

-n: sprawdź tylko, co usunie na desc, nie usuwaj wzorca: * .sh desc: / home / kg / tmp

cel: chcesz usunąć koniec pliku .sh na desc, ale jeśli to zrobisz, nie możesz usunąć na desc: rsync -rvz --exclude * .sh --delete -n conkg kg@192.168.31.202: / home / kg / tmp

powinien zmienić na: proszę dodać -n podczas testowania testu: rsync -rvz --exclude-from del.txt -n --delete conkg kg@192.168.31.202: / home / kg / tmp real delete: rsync -rvz - wyklucz-z del.txt - usuń conkg kg@192.168.31.202: / home / kg / tmp cat del.txt -s * .sh

lub: rsync -rvz --exclude -s * .sh --delete conkg kg@192.168.31.202: / home / kg / tmp


-2

wystarczy użyć opcji „--max-size = xx” i „--delete” programu rsync. Wszystko zrobi automatycznie i spełni wszystkie Twoje wymagania.


Byłoby to co najwyżej obejście. Chcę całkowicie pominąć pliki mov, avi i cr2, ponieważ generalnie są one bardzo duże. Ale te, które już wcześniej przesłałem na szybszą linię, powinny zostać zachowane. Problem polega na tym, że największe pliki JPG są większe niż najmniejsze pliki CR2, więc to rozwiązanie nie jest idealne. Wolę użyć funkcji wykluczania do filtrowania według nazw plików.
marlar
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.