Jak wykluczyć folder z rsync

60

Próbuję wykonać kopię zapasową mojego folderu domowego na dysku NAS. Daję to:

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ [email protected]:LinuxHome

gdzie rsync-exclude.txtma tę treść:

/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*

i jest w tym samym folderze, w którym uruchamiam rsync (folder domowy).

Jednak rsync próbuje również skopiować ten folder.

Co ja robię źle?

Xpanta
źródło

Odpowiedzi:

88

Jesteś zapewnienie bezwzględnych ścieżek w swojej wykluczyć listy.

W przypadku rsync wszystkie ścieżki wykluczania (lub dołączania!) Zaczynające się od /są zakotwiczone w „ katalogu głównym transferu ”.

Podstawą transferu w tym przypadku jest /home/chris. Jeśli zrobiłeś:

rsync -Paz --exclude-from 'rsync-exclude.txt' / [email protected]:

... wtedy twoje wyłączenia powinny działać (ale kopiowałbyś wszystko inne w tym systemie plików!).

Ale ponieważ próbujesz po prostu zsynchronizować swój katalog domowy , a nie ma podkatalogu /home/chrisnazwanego "home/chris/Downloads", rsyncnie znajdziesz nic pasującego.

Spróbuj więc usunąć /home/chrisczęści z rsync-exclude.txtpliku.

Właściwie powinieneś potrzebować tylko jednego wiersza w pliku:

/Downloads

Zauważ, że jeśli nie określisz wiodącego /, a akurat masz inne katalogi "Downloads", zostaną one również wykluczone. Zakładam, że chcesz tylko wykluczyć swój katalog „najwyższego poziomu” (w stosunku do katalogu źródłowego, zwanego także „katalogiem głównym transferu”) Downloads, więc będziesz potrzebować wiodącego /.

NAJPROSTSZY SPOSÓB (aby wykluczyć tylko kilka ścieżek)

Jeśli chcesz wykluczyć tylko jeden katalog, po prostu zrób to (unikając osobnego pliku):

rsync -Paz --exclude /Downloads /home/chris/ [email protected]:LinuxHome

Możesz także połączyć ze sobą --excludetagi, tak jak:

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ [email protected]:LinuxHome

Należy zauważyć, że ponieważ nie ma ukośnik, że jedno wyklucza .hiddenFilez jakichkolwiek każdym katalogu to kopie!

Ale jeśli masz więcej niż kilka wykluczeń, lepiej --exclude-frommieć plik i plik.

Uwaga

Widzę, że masz rację, ale tych nowych do rsync należy zwrócić uwagę na ukośnik na końcu z/home/chris/

Cytując rsyncstronę podręcznika: „Możesz pomyśleć o końcowym / w źródle, które oznacza„ skopiuj zawartość tego katalogu ”w przeciwieństwie do„ skopiuj katalog według nazwy ”.

Więc jeśli pominąłeś końcowy ukośnik, skończyłby się to katalogiem nazwanym chrisw katalogu docelowym, zawierającym wszystko od /home/chris( Downloadsoczywiście oprócz katalogu oryginalnego !).

Lambart
źródło
2

Może to być łatwiejsze dla oczu i tylko uwaga na temat wykluczania katalogów i składni:

SRC='/home/username'
DST='/run/media/username/EasyStoreRT/rsync'

rsync -avrh --stats                                 \
    --log-file=/home/username/log/rsync-home.log    \
    --exclude='/username/.cache'                    \
    --exclude='/username/.local/share/Trash'        \
    $SRC \
    $DST \

Wyłączy to te katalogi i wszystkie zawarte w nich pliki. Z jakiegokolwiek powodu rysnc nie dołączał / home / nazwa użytkownika do /.cache. Tylko strona główna / zakotwiczałaby się sama, więc musiałem dodać / nazwę użytkownika do każdego wykluczonego katalogu.

Strony podręcznika mówią: „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”. Ale ta hierarchia wydaje się być tylko pierwszym katalogiem w katalogu źródłowym. Używam wersji bash, wersja 4.4.23 (1).

jltrinchard
źródło