Jak wykluczyć wiele katalogów za pomocą rsync?

184

Próbuję wykonać kopię zapasową mojego katalogu domowego za pomocą rsync i chcę wykluczyć niektóre katalogi zawierające śmieci. Chcę wyraźnie wykluczyć /home/ben/.ccachei /home/ben/build. Niestety dokumentacja rsync była przepełnieniem informacji i nie odpowiedziała na moje pytanie. Oto, co próbowałem:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

Jak to zrobić?

Freedom_Ben
źródło
4
Chciałem tylko powiedzieć, że flaga już asugeruje r:)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Odpowiedzi:

238

OK, czuję się naprawdę głupio. Zanim opublikowałem to pytanie, mój przyjaciel pokazał mi, jak to zrobić i jest to naprawdę proste. Aby wykluczyć wiele katalogów, wystarczy użyć wielu --exclude=pathprzełączników. Więc moje powyższe polecenie poprawnie napisane jest następujące:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Freedom_Ben
źródło
7
Ścieżka bezwzględna nie działała dla mnie (podany katalog po cichu nie został wykluczony), podczas gdy ścieżka względem katalogu źródłowego działała poprawnie. Może czegoś mi brakuje, ale byłbym ostrożny w kwestii twierdzenia @FreeSoftwareServers, że ścieżki bezwzględne zawsze działają.
Soren Bjornstad,
5
FYI: Opcja -aobejmuje, -rwięc -arjest zbędna.
David
4
W przeciwieństwie do tego, co uważa FreeSoftwareServers, ścieżka wykluczenia jest względna do ścieżki źródłowej, NIE /. Tak więc ten komentarz jest kategorycznie fałszywy i doprowadzi do niepowodzeń, jeśli będziesz go przestrzegać. Najlepszą strategią jest pominięcie wiodących / wykluczeń, aby uniknąć tego rodzaju błędu psychicznego. Jeśli powiedzmy source, / home / me i jeśli wykluczysz = '/ mydir /', to wyklucza katalog mydir w / home / me, to znaczy wyklucza / home / me / mydir NOT / mydir / at /. To niefortunne, że nie mogę ani anulować ani edytować tego komentarza, ponieważ jest on technicznie niepoprawny i wprowadza w błąd.
Lizardx,
3
Dla twoich późniejszych podróżników wygląda na to, że komentarz @FreeSoftwareServer został usunięty. tl; dr: użyj ścieżek względnych
Freedom_Ben
2
Jeśli jesteś głupi, to ja i ja i 179 innych zwolenników!
Sridhar Sarnobat
108

Jeśli masz wiele katalogów i / lub plików do wykluczenia, utwórz plik tekstowy i użyj --exclude-fromprzełącznika. Utwórz plik o nazwie exclude_me.txti umieść w nim listę swoich wykluczeń. Przykład ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Wtedy twój rsync wyglądałby mniej więcej tak:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Oto kilka informacji na temat reguł filtrowania, które mogą pomóc:

  • /dir/ oznacza wyklucz folder główny /dir
  • /dir/*oznacza pobierz folder główny, /dirale nie zawartość
  • dir/ oznacza wykluczenie dowolnego folderu w dowolnym miejscu, w którym znajduje się nazwa dir/

  • Przykłady wykluczone: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfoznaczają pomijanie plików rozpoczynających się od cfdowolnego folderu w/var/spool/lpd

Zobacz także sekcję dotyczącą reguł filtrowania na stronie man.

użytkownik228759
źródło
4
Należy zauważyć, że folder główny oznacza katalog główny transferu, a nie katalog główny.
jamesdlin,
To świetna odpowiedź!
Alexander Zhukov,
85

Możesz także wykluczyć wiele ścieżek w nawiasach klamrowych:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
György Ráth
źródło
40
to działa ładnie, tylko nie pod sh, tylko pod bash, dowiedziałem się „na twardo”
xor
7
Brak miejsca po przecinku. Dowiedział się, że ciężko zbyt 😭
styl3r
I nie używaj '' jak --exclude = '. Gvfs'
Martin T.
FWIW, myślę, że nawiasy klamrowe działają z ksh. W przypadku innych pocisków, prawdopodobnie można użyć coś takiego: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Możesz też użyć wielu --excludeargumentów, które musisz wpisać ręcznie.
TSJNachos117
1
Powodem tego jest „Brace Expansion”, na wypadek gdyby ktoś chciał przyjrzeć się szczegółom.
shredalert