## Rsync

`Rsync` può essere utilizzato per il mirroring dei dati (in locale o remoto), i backup incrementali, la copia di file tra i sistemi e come un sostituto per i comandi scp, sftpe cp.

## Installare Rsync

`Rsync` è preinstallato nelle maggiori distribuzioni GNU/Linux, ma si può sempre verificare che sia presente nel sistema col seguente comando:

```bash
rsync --version
```

Se non fosse installato, si può installare facilmente usando il gestore pacchetti della distribuzione.

Per esempio su Debian e derivati:

```bash
sudo apt install rsync
```

## Sintassi

Local to Local:  `rsync [OPTION]... [SRC]... DEST`

Local to Remote: `rsync [OPTION]... [SRC]... HOST:DEST`

Remote to Local: `rsync [OPTION]... HOST:SRC... [DEST]`

dove:

`SRC` - Directory sorgente o di origine;

`DEST` - Directory di destinazione;

`HOST` - Hostname remoto o indirizzo IP.

`Rsync` fornisce una serie di opzioni che controllano ogni aspetto del suo comportamento. Le opzioni più utilizzate sono:

-`n`, avvia come simulazione, ovvero mostra solo quello che farebbe senza modificare realmente alcunché. Quest'opzione è FONDAMENTALE, in quanto permette di identificare eventuali comportamenti e/o risultati anomali e quindi di correggere il comando. Si ricordi che un errore nella definizione del comando può comportare la perdita dei dati nella cartella di destinazione o anche in quella sorgente se per esempio si invertono accidentalmente le due. Chiaramente una volta verificato il risultato della sincronizzazione quest'opzione andrà eliminata in modo da far effettivamente sincronizzare le directory;

-`r`, sincronizza anche le sottodirectory e tutti i relativi file;

-`t`, aggiorna anche la data di "Ultima modifica" dei file copiati nella cartella di destinazione;

-`p`, imposta per i file nella cartella di destinazione lo stesso `schema di permessi` di quelli sorgenti;

-`o`, imposta per i file nella cartella di destinazione lo stesso `proprietario` di quelli sorgenti, ove possibile;

-`g`, imposta per i file nella cartella di destinazione lo stesso `gruppo` di quelli sorgenti, ove possibile;

-`a`, (modalità archivio) è equivalente a impostare tutte le opzioni precedenti (`-rtpog`), e inoltre mantiene link simbolici, file speciali e (solo se eseguito come root) file dispositivo. Si possono invece trasformare tutti i link simbolici nei file a cui puntano con l'opzione i `-L`;

-`v`, aumenta il numero di informazioni stampate a video (verbose);

`-P` o `--progress`, mostra un indicatore percentuale del progresso delle operazioni. Implica l'opzione -v, pertanto se si specifica --progress è ridondante specificare anche -v;

`--delete`, elimina nella directory di destinazione tutti i file che non sono presenti nella directory sorgente; 

`--exclude-from`, specifica il percorso di un file contenente un elenco di file e cartelle da non includere nelle operazioni di sincronizzazione. Maggiori informazioni nell'apposita sezione.

-`z`, --compress. Questa opzione forzerà `Rsync` a comprimere i dati;

## Utilizzo di base di Rsync

Per copiare un singolo file `localmente` è necessario eseguire il comando seguente:

```bash
rsync -az /opt/filename.zip /tmp/newfilename.zip
```

Se la directory di destinazione non esiste verrà creata.

Vale la pena ricordare che, aggiungendo `/` alla directory di origine, verrà copiato solo il contenuto della directory nella directory di destinazione. Se omessa, `Rsync` copierà la directory di origine all'interno della directory di destinazione.

## Utilizzare Rsync per sincronizzare i dati da e verso una macchina remota

Quando si utilizza `Rsync` per il trasferimento remoto, deve essere installato sia sul computer di origine che su quello di destinazione. Le nuove versioni di `Rsync` sono configurate per utilizzare SSH come shell remota predefinita.

Nel seguente esempio, vine trasferita una directory da un computer locale a un computer remoto:

```bash
rsync -a /opt/media/ host_or_ip:/opt/media/
```

Se non è impostato un accesso SSH senza password al computer remoto, verrà chiesto di inserire la password dell'utente.

Se si desidera trasferire i dati da un server remoto a un computer locale, è *necessario utilizzare la posizione remota* come sorgente:

Se SSH sull'host remoto è in ascolto su una porta diversa dalla 22, è possibile specificare la porta utilizzando l'opzione `-e`:

```bash
rsync -a -e "ssh -p 2322" /opt/media/ host_or_ip:/opt/media/
```

Quando si trasferiscono grandi quantità di dati, si consiglia di eseguire il comando `Rsync` all'interno di `screen` o di utilizzare l'opzione `-P`.

## Escludere file e directory

Esistono due opzioni per escludere file e directory. La prima opzione è utilizzare l'argomento `--exclude` e specificare i file e le directory.

Nel seguente esempio, vengono escluse le directory `node_modules` e `tmp` che si trovano all'interno di `src_directory`:

```bash
rsync -a --exclude=node_modules --exclude=tmp /src_directory/ /dst_directory/
```

La seconda opzione è usare l'argomento `--exclude-from` e specificare i file e le directory che si desidera escludere in un file.

```bash
nano exclude-file.txt

node_modules
tmp
```

Quindi:

```bash
rsync -a --exclude-from='/exclude-file.txt' /src_directory/ /dst_directory/
```

## Backup locale

Ecco un esempio di come utilizzare `Rsync` per un backup locale:

```bash
rsync -aPz --delete --exclude-from='~/exlude.txt' ~/.config ~/bk_config
```

## Collegamenti

- [https://guide.debianizzati.org/index.php/Rsync](https://guide.debianizzati.org/index.php/Rsync)

- [https://wiki.ubuntu-it.org/AmministrazioneSistema/BackupDelSistema/Rsync](https://wiki.ubuntu-it.org/AmministrazioneSistema/BackupDelSistema/Rsync)

- [https://noviello.it/come-usare-Rsync-per-trasferire-file-locali-e-remoti-su-linux/](https://noviello.it/come-usare-`Rsync`-per-trasferire-file-locali-e-remoti-su-linux/)

- [https://wiki.ubuntu-it.org/AmministrazioneSistema/BackupDelSistema/Rsync](https://wiki.ubuntu-it.org/AmministrazioneSistema/BackupDelSistema/Rsync)
