Come risincronizzare più cartelle di origine


34

Voglio risincronizzare più fonti e mi chiedo il modo migliore per farlo.

per esempio

/etc/fstab
/home/user/download

Ho pensato a 3 soluzioni:

  • Soluzione 1

chiamata multipla a rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

con: più difficile avere stat statico

  • Soluzione 2

creare una tobackupcartella che contiene link simbolici e utilizzare le -Lopzioni

sync -aL /home/user/tobackup bkp

con: il contenuto del backup non deve contenere collegamenti simbolici

  • Soluzione 3

spostare i file in backup e creare un collegamento simbolico nella posizione originale

rsync -a /home/user/tobackup bkp

con: alcune configurazioni manuali

Quale mi consigliate?

Esiste un modo migliore ?


Risposte:


33

È possibile passare più argomenti di origine.

rsync -a /etc/fstab /home/user/download bkp

Questo crea bkp/fstabe bkp/download, come i comandi separati che hai dato. Potrebbe essere preferibile preservare invece la struttura di origine. Per fare ciò, usa /come sorgente e usa le regole include-exclude per specificare quali file copiare. Esistono due modi per farlo:

  • Includi esplicitamente ogni file e ogni componente di directory che lo conduce, con /***alla fine delle directory quando vuoi copiare l'intero albero di directory:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Includi tutte le directory di livello superiore con /*/(in modo che rsync attraversi /etce /homequando cerchi i file da copiare) e le directory di secondo livello con /*/*/(per /home/user), ma elimina le directory in cui nessun file viene copiato. Questo è più conveniente perché non devi elencare esplicitamente i genitori. Potresti anche usare --prune-empty-dirs --include='*/'invece di contare il numero di livelli, ma questo non è pratico qui poiché rsync attraverserebbe l'intero filesystem per esplorare le directory anche se nessuna delle regole include può corrispondere a qualcosa al di fuori /etce /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

1
Fantastico, ma come mantenere la struttura delle directory all'interno di bkp?
Rodrigo,

Voglio dire, bkp / etc / fstab e bkp / home / user / dowlonad? O forse / bkp / fstab e bkp / download?
Rodrigo,

@Rodrigo Ho modificato la mia risposta
Gilles 'SO- smetti di essere malvagio' il

13

Mi piace molto la risposta di Gilles, tuttavia, vorrei aggiungere che a mio avviso il requisito per sincronizzare più cartelle preservando la struttura delle directory è meglio soddisfatto passando più argomenti di origine insieme --relativeall'opzione.

In questo caso, potremmo avere qualcosa come segue:

rsync -aR /etc/fstab /home/user/download bkp

che si tradurrebbe in bkp/etc/fstabe bkp/home/user/download.

La parte migliore di questo è che (credo da rsync v. 2.6.7) possiamo essenzialmente controllare quanta struttura di directory vogliamo replicare sul ricevitore.
(Vedi la documentazione --relativesull'opzione qui )

Ad esempio, se lo facessimo

rsync -aR /home/./user1/download /home/./user2/download bkp

finiremmo con bkp/user1/downloade bkp/user2/download.


2

Questo funziona anche: parentesi graffe, contenenti un elenco di fonti separato da virgole.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Un po 'simile a ciò che accade quando invochi parentesi graffe sytnax con cp e alcune altre utilità:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive

Come specificheresti la porta ssh con questo? Questa sintassi sembra funzionare quando si utilizza-e
tcurdt
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.