Guide Rysnc et 11 exemples pour l’utiliser efficacement



Rsync se présente comme un outil en ligne de commande, accessible et gratuit, conçu pour la synchronisation de fichiers, qu’elle soit locale ou distante. Il permet de transférer des fichiers et des dossiers avec une grande efficacité.

Son utilité est manifeste lors de migrations de données, de la création de sauvegardes et de la mise en place de mécanismes de mirroring. Il s’avère donc un allié précieux pour les webmasters et les administrateurs système, notamment pour les tâches répétitives de transfert de données.

Ce guide vise à éclairer le fonctionnement de Rsync et à fournir des exemples d’utilisation concrets.

Comment opère Rsync ?

Rsync est un utilitaire de synchronisation à distance, fonctionnant en ligne de commande, et spécifiquement conçu pour les environnements de type Unix. Il offre la possibilité aux utilisateurs de transférer ou de synchroniser des fichiers entre différentes machines ou hôtes de manière transparente.

Techniquement, Rsync s’appuie sur l’algorithme de transfert delta. Cet algorithme compare les fichiers sur deux hôtes (source et destination), qu’ils soient locaux ou distants, et ne copie que les différences. La commande Rsync peut effectuer des opérations de copie et de synchronisation de deux façons différentes :

  • En utilisant SSH ou RSH pour la synchronisation entre deux hôtes.
  • En utilisant le démon TCP de Rsync pour la synchronisation.

Conçu initialement pour les systèmes de type Unix, Rsync est également pleinement fonctionnel sous Linux.

Voici le processus d’utilisation de Rsync étape par étape :

  • Rsync établit une connexion SSH avec l’hôte distant et demande une authentification par mot de passe.
  • Une fois la connexion établie, le processus Rsync de l’hôte distant communique avec la source.
  • Ces programmes identifient les fichiers et répertoires nécessitant une synchronisation. L’algorithme de transfert delta est alors utilisé pour détecter les modifications entre les fichiers.

Si Rsync ne trouve pas un fichier sur la destination, mais qu’il est présent sur l’hôte source, il le copie et le transfère. Pour les fichiers existant déjà sur les deux systèmes, Rsync ne transfère que les modifications (les parties modifiées). Enfin, il ignore les fichiers identiques sur les deux systèmes.

La commande Rsync effectue des mises à jour progressives en stockant les différences dans un fichier temporaire avant de les transférer vers la destination.

Avant de démarrer, assurez-vous d’avoir :

  • Les privilèges root ou sudo.
  • Un accès au terminal ou à la ligne de commande.
  • Un accès SSH pour exécuter les commandes Rsync en toute sécurité.
  • Deux machines pour effectuer la synchronisation.

Dans ce tutoriel, nous utiliserons Linux Mint 21.1 Vera, mais il est possible de suivre ce guide sans difficulté avec d’autres distributions Linux.

Pourquoi choisir Rsync plutôt que Scp ?

Scp (Secure copy) est un protocole en ligne de commande populaire permettant la copie de fichiers de manière sécurisée, via SSH. Scp fonctionne de manière linéaire en copiant simplement les fichiers de la source vers la destination.

La syntaxe de la commande Scp est la suivante :

scp option SOURCE DESTINATION

Mais alors, pourquoi utiliser Rsync au lieu de Scp ?

L’utilisation de Rsync présente plusieurs avantages :

  • Exécution plus rapide : Rsync est plus rapide que Scp car il utilise un protocole de mise à jour à distance, ne transférant que les différences plutôt que le fichier entier. Lors de synchronisations régulières, seule une copie complète est nécessaire la première fois, les suivantes ne transférant que les modifications grâce à l’algorithme delta.
  • Moins de consommation de bande passante : Rsync réduit la consommation de bande passante en ne recopiant pas les fichiers entiers. Il utilise également des algorithmes de compression et de décompression pour réduire la taille des fichiers pendant le transfert.
  • Plus d’options de ligne de commande : Rsync surpasse Scp en termes d’options de ligne de commande, permettant un réglage plus fin de son comportement.

En conclusion, Rsync est un outil idéal pour la synchronisation incrémentale, tandis que Scp est utile pour le transfert sécurisé de fichiers. Dans un scénario courant, Scp est suffisant pour les tâches quotidiennes simples, tandis que Rsync est préférable pour les opérations répétitives.

Syntaxe de la commande Rsync

La structure générale de la commande Rsync est la suivante :

rsync OPTION SOURCE DESTINATION

Les termes sont définis ci-dessous :

  • OPTION : Les options de la commande Rsync.
  • SOURCE : Le répertoire source.
  • DEST : Le répertoire de destination.
  • USER : Nom d’utilisateur distant
  • HOST : Nom d’hôte ou adresse IP distante.

Les options permettent d’ajouter des fonctionnalités supplémentaires à la commande. Par exemple, l’option ‘-r’ permet de synchroniser des données de manière récursive. Cependant, l’option ‘-r’ ne synchronise pas les informations telles que la propriété des groupes et des utilisateurs, les horodatages, les permissions ou les liens symboliques. Pour cela, l’option ‘-a’ (mode archive) peut être utilisée pour garantir la conservation de ces informations lors de la copie.

Autres options courantes de Rsync :

  • -z : Compressser les données afin d’économiser de l’espace.
  • -h : Afficher la sortie dans un format lisible par l’homme.
  • -b : Effectuer une sauvegarde pendant la synchronisation des données.
  • -e : Utiliser le protocole SSH pour les transferts à distance.
  • –progress : Afficher la progression de la synchronisation des données.
  • -v : Augmenter la verbosité de la sortie de Rsync.
  • –n : Effectuer un test de simulation pour vérifier les paramètres de synchronisation.
  • -q : Supprimer la sortie et les options de la commande Rsync.

Installation de Rsync

La plupart des systèmes Unix et Linux ont Rsync installé par défaut. Si ce n’est pas le cas, vous pouvez l’installer en utilisant les commandes ci-dessous.

Pour Debian/Ubuntu et Mint :

sudo apt-get install rsync

Pour Arch Linux :

pacman -S rsync

Sur Gentoo :

emerge sys-apps/rsync

Sur CentOS/Fedora/REHL :

sudo yum install rsync

Sur openSUSE :

sudo zypper install rsync

Comme nous utilisons Linux Mint, Rsync est déjà installé. Vous pouvez vérifier en exécutant la commande ‘rsync’ dans le terminal, qui affichera ses capacités, ses options et d’autres informations.

nitt ~
$ rsync
rsync  version 3.2.3  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
    batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
    symtimes, prealloc, stop-at, no crtimes
Optimizations:
    SIMD, no asm, openssl-crypto
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.

Voyons maintenant des exemples d’utilisation de Rsync.

Pour les besoins de ce tutoriel, nous allons créer deux répertoires :

  • répertoire-source
  • répertoire-dest

Utilisez les commandes suivantes pour les créer :

mkdir source-directory
mkdir dest-directory

De plus, nous allons générer quelques fichiers pour tester Rsync. Créons des fichiers de test avec la commande ci-dessous :

touch source-directory/file{1..100}

Cela crée 100 fichiers vides dans le répertoire source. Vous pouvez le confirmer avec la commande ci-dessous :

ls source-directory
Output:
nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ touch source-directory/file{1..100}
nitt rsync-tutorial
$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Notez que le répertoire ‘dest-directory’ est vide.

Copie récursive de répertoires localement

Bien que Rsync soit principalement utilisé pour la copie de fichiers entre un serveur local et distant, il est également très utile pour les copies locales.

Dans ce cas, nous allons utiliser la syntaxe Rsync suivante :

rsync option SOURCE DESTINATION

Copiez les fichiers de notre répertoire source vers le répertoire dest en exécutant la commande suivante :

rsync -r source-directory/ dest-directory

Ici, la commande copie ‘récursivement’ les fichiers du répertoire source vers le répertoire dest.

nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ ls dest-directory
nitt rsync-tutorial
$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99
nitt rsync-tutorial
$ rsync -r source-directory/ dest-directory
nitt rsync-tutorial
$ ls dest-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Cela copie chaque fichier du répertoire source vers le répertoire dest.

Copie locale d’un fichier unique

Maintenant que nous savons comment synchroniser deux répertoires, nous allons apprendre à copier un fichier seul.

Pour cela, nous allons éditer le fichier vide file1 dans le répertoire source puis le synchroniser avec le même fichier présent dans le répertoire dest.

Pour modifier un fichier, entrez la commande suivante :

nano source-directory/file1

Maintenant, copiez-collez le texte suivant dans l’éditeur nano :

We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.

Ajouter du contenu à un fichier.

Fermez et enregistrez le fichier.

Copions maintenant le fichier en utilisant rsync :

sudo rsync -v --existing source-directory/file1 dest-directory
#Output
nitt rsync-tutorial
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1

sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
total size is 474  speedup is 0.80

nitt rsync-tutorial
$ 

Comme vous l’avez peut-être remarqué, nous avons utilisé l’option ‘–existing’. Cela met à jour les fichiers existants. Si vous exécutez la commande sans ‘–existing’, elle ne sera pas mise à jour, même si elle s’exécute avec succès.

Si le fichier unique que vous copiez n’existe pas dans le dossier de destination, vous devez exécuter la commande suivante :

rsync -v source-directory/newfile dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile dest-directory
newfile

sent 82 bytes  received 35 bytes  234.00 bytes/sec
total size is 0  speedup is 0.00

Copie de plusieurs fichiers

Si vous avez l’intention de copier plusieurs fichiers, vous devez mentionner les chemins source des fichiers, suivis du répertoire de destination.

Pour cela, nous allons créer deux nouveaux fichiers : newfile2 et newfile3, dans le répertoire source. Utilisez la commande suivante pour ce faire :

touch source-directory/newfile{2..3}

Maintenant, utilisez la commande suivante pour synchroniser plusieurs fichiers :

rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3

sent 135 bytes  received 54 bytes  378.00 bytes/sec
total size is 0  speedup is 0.00
nitt rsync-tutorial
$ 

Copie de fichiers ou de répertoires de local à distant

La syntaxe Rsync pour le transfert local vers distant est la suivante :

rsync option SOURCE [email protected]:DEST

Comme vous pouvez le voir, vous devez connaître l’adresse IP de la machine distante. De plus, vous devez ajouter l’adresse IP après le fichier source.

rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Avant de commencer le transfert, il vous sera demandé un mot de passe. Saisissez-le pour continuer. De plus, si l’utilisateur est différent sur la machine distante, vous devez le mentionner avant l’adresse IP, suivi de @.

rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory

Si vous avez l’intention de copier plusieurs fichiers ou répertoires, vous devez les répertorier. La syntaxe est ci-dessous :

rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Protocoles spécifiques pour les transferts distants

Rsync vous permet de spécifier des protocoles de transfert de fichiers spécifiques. Pour ce faire, vous devez utiliser l’option -e, suivie du protocole.

Par exemple, si vous souhaitez utiliser le protocole ssh, vous devez ajouter ‘-e ssh’ à la commande rsync.

rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Copie de fichiers ou de répertoires de distant à local

La syntaxe Rsync pour le transfert de distant à local est la suivante :

rsync option [email protected]:SRC DEST

Cela fonctionne comme une demande d’extraction. Ainsi, pour obtenir les fichiers ou répertoires requis d’un serveur distant vers votre ordinateur local, vous devez exécuter la commande suivante :

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

La commande extrait les fichiers du répertoire dest de la machine distante vers le répertoire source de la machine locale.

De même, vous pouvez extraire un fichier spécifique en le mentionnant via son chemin complet :

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory

Pour copier plusieurs fichiers ou répertoires de distant à local, vous devez spécifier le chemin entre accolades (séparés par des virgules) après l’adresse IP du serveur :

rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory

De même, vous pouvez également mentionner des fichiers.

Afficher la progression en direct pendant le transfert

Il est judicieux de surveiller la progression en direct, notamment pour les sauvegardes de données volumineuses. Pour cela, utilisez l’option ‘–progress’. Ajoutez-la à la commande Rsync pour afficher la vitesse de transfert, le temps restant et la quantité de données transférées.

rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Supprimer les fichiers sources une fois le transfert terminé

Vous pouvez utiliser l’option ‘–remove-source-files’ pour supprimer les fichiers sources après le transfert complet. Cette option peut être utile dans divers cas, notamment pour sécuriser vos fichiers sans laisser de trace ou pour libérer de l’espace.

rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Simulation Rsync (marche à blanc)

Rsync permet d’évaluer une opération avant son exécution réelle, afin d’éviter les erreurs, telles que la mise à jour ou la suppression involontaire de fichiers.

Pour effectuer une simulation, utilisez l’option ‘–dry-run’. Ajoutez-la à la commande, suivie de la source et de la destination.

sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1

sent 43 bytes  received 19 bytes  124.00 bytes/sec
total size is 474  speedup is 7.65 (DRY RUN)
nitt rsync-tutorial

La sortie est similaire à une exécution normale, mais vous remarquerez la mention ‘(DRY RUN)’ à la fin de la sortie.

Définir la taille de fichier minimale et maximale

Rsync permet de définir une taille de fichier minimale ou maximale pendant le transfert.

Pour transférer des fichiers d’une taille minimale de 15 Ko, utilisez ‘–min-size=15k’ :

rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

La commande ne copiera que les fichiers d’une taille minimale de 15 Ko. Les fichiers plus petits seront ignorés.

De même, utilisez l’option ‘–max-size’ pour définir une taille maximale :

rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Ici, Rsync ignorera les fichiers d’une taille supérieure à 450 Ko.

Définir une limite de bande passante

Si vous effectuez des tâches gourmandes en bande passante, vous pouvez limiter la bande passante utilisée par Rsync en utilisant le paramètre ‘–bwlimit=KB/s’ :

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Ici, nous limitons la bande passante à 100 Ko/s pendant le transfert.

Dernières réflexions

Ceci conclut notre guide sur les commandes Rsync. Nous avons appris à utiliser Rsync et abordé de nombreuses commandes importantes.

Cependant, Rsync offre bien plus de fonctionnalités que ce que nous avons couvert ici. Consultez la page de manuel de Rsync pour une exploration plus approfondie.

N’hésitez pas également à consulter des guides de référence sur les lignes de commande pour Windows, Linux et macOS.