Come escludere più directory con rsync?


184

Sto provando a fare il backup della mia directory home usando rsync e voglio escludere alcune delle directory che contengono posta indesiderata. Voglio specificamente escludere /home/ben/.ccachee /home/ben/build. Sfortunatamente la documentazione per rsync era sovraccarico di informazioni e non ha risposto alla mia domanda. Questo è quello che ho provato:

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

Qual è il modo giusto per farlo?


4
Volevo solo dire che la bandiera aimplica rgià :)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Risposte:


238

OK, mi sento davvero stupido. Prima ancora di pubblicare questa domanda, il mio amico mi ha mostrato come farlo ed è davvero semplice. Per escludere più directory basta usare più --exclude=pathswitch. Quindi il mio comando sopra scritto correttamente è il seguente:

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

7
Un percorso assoluto non ha funzionato per me (la directory specificata non è stata silenziosamente esclusa), mentre un percorso relativo alla directory di origine ha funzionato correttamente. Forse mi manca qualcosa, ma sarei cauto nell'affermare @FreeSoftwareServers che i percorsi assoluti funzionano sempre.
Soren Bjornstad,

5
Cordiali saluti: L'opzione -ainclude -rquindi -arè ridondante.
David,

4
Contrariamente a quanto ritiene FreeSoftwareServers, il percorso di esclusione è relativo al percorso di origine, NOT /. Quindi quel commento è categoricamente falso e porterà a fallimenti se lo segui. La migliore strategia è quella di lasciare il comando / nel tuo escluso per evitare questo tipo di errore mentale. Se source è, / home / me e se si esclude = '/ mydir /' questo esclude la directory mydir in / home / me, cioè esclude / home / me / mydir NOT / mydir / at /. È un peccato che non riesca a ridimensionare o modificare quel commento poiché è tecnicamente sbagliato e fuorvia.
Lizardx,

3
Cordiali saluti per i viaggiatori successivi, sembra che il commento in questione di @FreeSoftwareServer sia stato rimosso. tl; dr: usa i percorsi relativi
Freedom_Ben

2
Se sei stupido, lo sono anche io e altri 179 utenti!
Sridhar Sarnobat,

108

Quando si hanno più directory e / o file da escludere, creare un file di testo e utilizzare l' --exclude-fromopzione. Crea un file chiamato exclude_me.txte in esso sono elencate le tue esclusioni. Esempio ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Quindi il tuo rsync sarebbe simile a questo:

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

Queste sono alcune informazioni sulle regole di filtro che possono aiutare:

  • /dir/ significa escludere la cartella principale /dir
  • /dir/*significa ottenere la cartella principale /dirma non i contenuti
  • dir/ significa escludere qualsiasi cartella in cui sia presente il nome dir/

  • Esempi esclusi: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfsignifica saltare i file che iniziano con cfqualsiasi cartella all'interno/var/spool/lpd

Vedi anche la sezione delle regole di filtro nella pagina man.


4
È importante notare che la cartella principale indica la radice del trasferimento non la directory principale.
jamesdlin,

Questa è una risposta brillante!
Alexander Zhukov,

85

Puoi anche escludere più percorsi all'interno di parentesi graffe:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/

40
funziona bene, ma non sotto sh, solo sotto bash, ho scoperto "nel modo più duro"
xo

7
Nessuno spazio dopo la virgola. L'ho imparato anche nel modo più difficile 😭
styl3r

E non usare '' like --exclude = '. Gvfs'
Martin T.

FWIW, penso che le parentesi graffe lavorino con ksh. Per altre shell, probabilmente si potrebbe usare qualcosa come: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Oppure, potresti semplicemente usare più --excludeargomenti, che dovresti digitare manualmente.
TSJNachos117,

1
Il motivo per cui funziona è a causa di "Brace Expansion", nel caso in cui qualcuno volesse guardare i dettagli.
shredalert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.