rsync [OPTIONS] SOURCE DESTINATION
rsync : synchroniser ses donnéesrsync et Pourquoi l’Utiliser ?/ à la Fin de la Source--delete (À MANIPULER AVEC EXTRÊME PRÉCAUTION !) rsync c’est bon pour la santé, mangez-en !Vous utilisez peut-être déjà la commande pour copier des fichiers et des répertoires sous Linux. Mais connaissez-vous cp ? C’est comme une version avancée de rsync , incroyablement puissante et efficace, surtout pour les sauvegardes et la synchronisation de données, que ce soit sur votre machine locale ou vers un serveur distant.cp
rsync et Pourquoi l’Utiliser ? = Remote Sync (Synchronisation à Distance)rsync
Imaginez que vous devez copier un gros dossier de données scientifiques vers un dossier de sauvegarde pour la deuxième fois. Avec , vous copiez tout à nouveau, même les données qui n’ont pas changé. C’est long et inefficace.cp
, lui, est plus malin :rsync
Il compare la source (ce que vous voulez copier) et la destination (où vous voulez copier).
Il ne transfère que les différences : les nouveaux fichiers, les fichiers modifiés, ou juste les morceaux modifiés à l’intérieur des fichiers (c’est son algorithme "delta transfer").
Il peut copier des fichiers localement (comme ) mais aussi à travers le réseau (vers/depuis un autre ordinateur ou serveur comme cp ) de manière sécurisée (en utilisant SSH).scp
Il offre une multitude d'options pour contrôler précisément ce qui est copié, comment c’est copié, et ce qui est exclu.
Pourquoi utiliser ?rsync
Efficacité : Gain de temps et de bande passante énorme, surtout pour les mises à jour régulières ou les gros volumes de données.
Sauvegardes : Parfait pour créer et maintenir des sauvegardes de vos données importantes.
Synchronisation : Garder deux répertoires (local ou distant) identiques.
Transferts Réseau : Copier des fichiers vers/depuis des serveurs simplement et de manière sécurisée.
Flexibilité : De nombreuses options pour affiner le comportement (exclusions, compression, suppression…).
La structure de base de la commande est simple :rsync
rsync [OPTIONS] SOURCE DESTINATION
: Contrôlent le comportement de [OPTIONS] (nous allons en voir beaucoup !).rsync
: Le fichier ou le répertoire que vous voulez copier.SOURCE
: L’endroit où vous voulez copier la source.DESTINATION
La et la peuvent être des chemins locaux (ex: , ) ou distants (ex: ).
|
cp)Commençons par copier un répertoire localement.
# Créer un répertoire source et y mettre quelques fichiers mkdir repertoire_source touch repertoire_source/fichier1.txt echo "Contenu initial" > repertoire_source/fichier2.txt mkdir repertoire_source/sous_dossier touch repertoire_source/sous_dossier/fichier3.txt # Créer un répertoire de destination vide mkdir repertoire_destination # Vérifier la structure initiale echo "--- Structure Initiale ---" ls -lR repertoire_source/ repertoire_destination/
rsync (juste pour voir)echo "" echo "--- Copie Simple (rsync -vr source/ dest/) ---" # Copier le répertoire source DANS la destination # -v : Verbose (bavard), pour voir ce que rsync fait # -r : Récursif, pour copier les sous-répertoires et leur contenu rsync -vr repertoire_source/ repertoire_destination/ echo "" echo "--- Structure Destination Après Copie Simple ---" ls -lR repertoire_destination/
Résultat Attendu : va lister les fichiers qu’il transfère. Le contenu de rsync repertoire_source se retrouvera DANS repertoire_destination. La structure sera : , repertoire_destination/fichier1.txt , repertoire_destination/fichier2.txt .repertoire_destination/sous_dossier/fichier3.txt
l’exemple précédent indiquait à tort que le répertoire source était copié, l’utilisation du / change cela, voir section 3).
|
-a (Mode Archive)Pour synchroniser des répertoires, l’option -a est presque toujours ce que vous voulez. C’est un raccourci pour plusieurs options très utiles :
-r : Récursif (copie les sous-répertoires).
-l : Copie les liens symboliques comme des liens.
-p : Préserve les permissions des fichiers.
-t : Préserve les dates de modification des fichiers.
-g : Préserve le groupe propriétaire.
-o : Préserve l’utilisateur propriétaire (nécessite souvent d’être root/sudo).
-D : Préserve les fichiers spéciaux (devices, fifos).
En gros, -a essaie de faire une copie la plus fidèle possible de la source.
-a)echo "" echo "--- Préparation pour copie Archive ---" # Vider la destination pour repartir à zéro rm -rf repertoire_destination/* echo "Destination vidée." echo "" echo "--- Copie Archive (rsync -av source/ dest/) ---" # Copier le CONTENU de source DANS destination (notez le '/' après source!) rsync -av repertoire_source/ repertoire_destination/ echo "" echo "--- Structure Destination Après Copie Archive ---" # Vérifier le contenu de la destination ls -l repertoire_destination/ # Vérifier aussi un sous-dossier ls -l repertoire_destination/sous_dossier/
Résultat Attendu : Le contenu de repertoire_source est maintenant directement dans repertoire_destination (ex: ). Les permissions et dates devraient être préservées (vérifiez avec repertoire_destination/fichier1.txt ls -l). L’option -v (verbose) montre ce qui est fait.
Ajoutons quelques options pratiques :
-h : Human-readable. Affiche les tailles de fichiers de manière lisible (Ko, Mo, Go).
--progress : Affiche la progression du transfert pour chaque fichier (utile pour les gros fichiers).
-n ou --dry-run : L’option la plus importante pour débuter ! Simule l’opération sans rien modifier. vous dira exactement ce qu’il ferait, mais ne le fera pas.rsync
Toujours utiliser --dry-run avant une commande rsync potentiellement dangereuse (comme avec --delete) ou si vous n’êtes pas sûr !
|
echo "" echo "--- Modification de la source ---" # Modifier un fichier dans la source echo "Contenu modifié" >> repertoire_source/fichier2.txt # Ajouter un nouveau fichier touch repertoire_source/nouveau_fichier.txt echo "Source modifiée." echo "" echo "--- Simulation de la mise à jour (Dry Run) ---" # SIMULER la mise à jour de la destination # Combinaison courante : archive, verbose, human-readable, progress, dry-run rsync -avhn --progress --dry-run repertoire_source/ repertoire_destination/ echo "" echo "--- Vérification Destination après Dry Run (doit être inchangée) ---" # Vérifier : La destination n'a PAS changé ls -l repertoire_destination/ cat repertoire_destination/fichier2.txt
Résultat Attendu : va lister les fichiers qu’il mettrait à jour (rsync ) et ceux qu’il ajouterait (fichier2.txt ), mais les fichiers dans nouveau_fichier.txt repertoire_destination resteront inchangés. La sortie montrera les actions prévues.
echo "" echo "--- Exécution réelle de la mise à jour ---" # Maintenant qu'on a vu ce que ça ferait, on lance la vraie commande (sans -n) rsync -avh --progress repertoire_source/ repertoire_destination/ echo "" echo "--- Vérification Destination après Exécution Réelle ---" # Vérifier : La destination est maintenant à jour ls -l repertoire_destination/ cat repertoire_destination/fichier2.txt
Résultat Attendu : est mis à jour (le nouveau contenu est ajouté) et fichier2.txt est ajouté dans la destination.nouveau_fichier.txt
Prenez l’habitude : --dry-run ou -n d’abord, puis enlevez le si la simulation vous convient.
|
/ à la Fin de la SourceC’est LE point qui piège le plus les débutants avec . La présence ou l’absence d’un slash rsync / à la fin du chemin de la source change radicalement le comportement !
SANS slash final (ex: ) : rsync … source destination/ copie le répertoire rsync source lui-même à l’intérieur de destination. Résultat : destination/source/…
AVEC slash final (ex: ) : rsync … source/ destination/ copie le contenu du répertoire rsync source directement dans destination. Résultat : (les fichiers de destination/… source sont directement dans dest).
# --- Préparation --- echo "" echo "--- Préparation pour test Slash ---" mkdir src_dir_slash_test touch src_dir_slash_test/file_A.txt touch src_dir_slash_test/file_B.txt mkdir dest_dir_slash_1 mkdir dest_dir_slash_2 echo "Structure initiale :" tree src_dir_slash_test/ dest_dir_slash_1/ dest_dir_slash_2/ # Utilise 'tree' si installé, sinon 'ls -R' # --- Cas 1 : SANS slash final sur la source --- echo "" echo "=== Copie SANS slash final (rsync -av src_dir_slash_test dest_dir_slash_1/) ===" rsync -av --dry-run src_dir_slash_test dest_dir_slash_1/ # Simulation rsync -av src_dir_slash_test dest_dir_slash_1/ # Exécution echo "Structure dest_dir_slash_1 après copie SANS slash :" tree dest_dir_slash_1/ # Attendu : dest_dir_slash_1 contient le dossier src_dir_slash_test # --- Cas 2 : AVEC slash final sur la source --- echo "" echo "=== Copie AVEC slash final (rsync -av src_dir_slash_test/ dest_dir_slash_2/) ===" rsync -av --dry-run src_dir_slash_test/ dest_dir_slash_2/ # Simulation rsync -av src_dir_slash_test/ dest_dir_slash_2/ # Exécution echo "Structure dest_dir_slash_2 après copie AVEC slash :" tree dest_dir_slash_2/ # Attendu : dest_dir_slash_2 contient directement file_A.txt et file_B.txt # --- Nettoyage (optionnel) --- echo "" echo "--- Nettoyage Test Slash ---" rm -rf src_dir_slash_test dest_dir_slash_1 dest_dir_slash_2
Retenez bien : Pour synchroniser le contenu d’un dossier source vers un dossier destination, mettez un / à la fin de la source.
C’est l’une des grandes forces de . Il utilise SSH (Secure Shell) pour se connecter à une machine distante et transférer les fichiers de manière sécurisée.rsync
Syntaxe : Il suffit d’indiquer la machine distante dans la SOURCE ou la DESTINATION sous la forme : [user@]host:/chemin/absolu/ou/relatif
: Optionnel si votre nom d’utilisateur est le même sur les deux machines.user@
: Le nom d’hôte ou l’adresse IP de la machine distante.host
: Le séparateur (important !!!).:
: Le chemin sur la machine distante. S’il commence par /chemin/… /, c’est un chemin absolu. Sinon, il est relatif au répertoire personnel ( ) de l’utilisateur distant.$HOME
Authentification : via SSH utilisera votre authentification SSH habituelle :rsync
Soit il vous demandera un mot de passe.
Soit il utilisera une clé SSH si vous en avez configuré une (méthode recommandée et plus sécurisée).
# Créer un dossier local pour l'exemple
mkdir mon_projet_local
echo "Code source" > mon_projet_local/main.py
echo "README" > mon_projet_local/README.md
# --- Définir les variables ---
LOCAL_SOURCE="./mon_projet_local/" # Slash final pour copier le contenu
REMOTE_USER="devuser"
REMOTE_HOST="serveur.example.com" # Remplacez par un vrai serveur si vous testez
REMOTE_DEST_PATH="/projets/" # Chemin absolu distant
# --- Simulation d'abord ! ---
echo ">>> SIMULATION Copie vers distant <<<"
rsync -avhn --progress --dry-run "$LOCAL_SOURCE" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DEST_PATH}"
# --- Exécution réelle si la simulation est OK ---
# echo ">>> EXECUTION Copie vers distant <<<"
# rsync -avh --progress "$LOCAL_SOURCE" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DEST_PATH}"
# (On vous demandera le mot de passe de 'devuser' si pas de clé SSH configurée)
# Nettoyage local
rm -rf mon_projet_local
# --- Définir les variables ---
REMOTE_USER="produser"
REMOTE_HOST="backup.example.com" # Remplacez par un vrai serveur
REMOTE_SOURCE_PATH="/home/produser/backups_site/" # Chemin absolu distant, slash final
LOCAL_DEST="./sauvegardes_recuperees/" # Répertoire local
# Créer le répertoire local de destination s'il n'existe pas
mkdir -p "$LOCAL_DEST"
# --- Simulation ---
echo ">>> SIMULATION Copie depuis distant <<<"
rsync -avhn --progress --dry-run "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SOURCE_PATH}" "$LOCAL_DEST"
# --- Exécution réelle si OK ---
# echo ">>> EXECUTION Copie depuis distant <<<"
# rsync -avh --progress "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SOURCE_PATH}" "$LOCAL_DEST"
# Nettoyage local
# rm -rf "$LOCAL_DEST" # Attention si vous avez vraiment récupéré des données
Port SSH différent : Si le serveur SSH distant écoute sur un port autre que le port 22 standard, utilisez l’option -e :
# Se connecter sur le port 2222
# Créer un dossier local exemple
mkdir local_dir_port_test; touch local_dir_port_test/fichier_port.txt
REMOTE_USER="user"
REMOTE_HOST="host.example.com" # Remplacez
REMOTE_PORT="2222"
REMOTE_DEST="/remote/dir/"
# Simulation
rsync -avhn -e "ssh -p ${REMOTE_PORT}" ./local_dir_port_test/ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DEST}"
# Exécution réelle si OK
# rsync -avh -e "ssh -p ${REMOTE_PORT}" ./local_dir_port_test/ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DEST}"
# Nettoyage
rm -rf local_dir_port_test
--delete (À MANIPULER AVEC EXTRÊME PRÉCAUTION !)Par défaut, ajoute et met à jour les fichiers dans la destination, mais il ne supprime jamais rien. L’option rsync --delete change cela : elle rend la destination strictement identique à la source en supprimant les fichiers présents dans la destination mais absents de la source.
Cas d’Usage : Créer un miroir exact, nettoyer une destination, sauvegarde où l’on ne veut garder que la version actuelle de la source.
L’option --delete peut entraîner une PERTE IRRÉVERSIBLE DE DONNÉES dans la destination si vous faites une erreur dans la source ou la destination ! Utilisez TOUJOURS --dry-run (-n) avant d’exécuter une commande avec --delete. VÉRIFIEZ attentivement la sortie du dry-run pour voir quels fichiers seraient supprimés (deleting …).
|
--delete# --- Préparation --- echo "" echo "--- Préparation Test --delete ---" mkdir source_miroir touch source_miroir/fichier_A.txt touch source_miroir/fichier_B.txt # Fichier qui restera mkdir destination_miroir touch destination_miroir/fichier_A.txt # Fichier commun touch destination_miroir/fichier_C.txt # Fichier EXTRA à supprimer echo "Contenu initial dest C" > destination_miroir/fichier_C.txt echo "--- Structure initiale ---" tree source_miroir/ destination_miroir/ # --- Simulation AVEC --delete --- echo "" echo "=== Simulation rsync -avhn --delete source_miroir/ destination_miroir/ ===" # Note: -n pour dry-run rsync -avhn --progress --delete source_miroir/ destination_miroir/ # ATTENDU: rsync doit indiquer "deleting fichier_C.txt" # --- Vérification après simulation --- echo "" echo "Structure destination APRES SIMULATION (doit être inchangée) :" tree destination_miroir/ cat destination_miroir/fichier_C.txt # Doit encore exister # --- Exécution réelle AVEC --delete (SI ET SEULEMENT SI la simulation est correcte) --- echo "" echo "=== Exécution réelle rsync -avh --delete source_miroir/ destination_miroir/ ===" rsync -avh --progress --delete source_miroir/ destination_miroir/ # Pas de -n ici ! echo "Structure destination APRES EXECUTION :" tree destination_miroir/ # Vérifier que fichier_C.txt n'existe plus ls destination_miroir/fichier_C.txt || echo "fichier_C.txt a bien été supprimé." # --- Nettoyage (optionnel) --- echo "" echo "--- Nettoyage Test --delete ---" rm -rf source_miroir destination_miroir
Soyez particulièrement vigilant avec le chemin de destination lorsque vous utilisez --delete. Une erreur (ex: rsync --delete source/ ~/ au lieu de rsync --delete source/ /media/backup/) pourrait avoir des conséquences désastreuses sur HOME Directory !
|
Vous ne voulez pas toujours tout copier. permet d’exclure facilement certains fichiers ou dossiers.rsync
Option --exclude=PATTERN : Exclut les fichiers/répertoires correspondant au PATTERN.
Le PATTERN peut utiliser des jokers simples comme * (n’importe quelle séquence de caractères) et ? (n’importe quel caractère unique).
Le chemin dans le PATTERN est relatif à la racine de la source transférée.
Utilisations courantes :
Exclure les fichiers de log : --exclude='*.log'
Exclure un répertoire temporaire : --exclude='tmp/' (le / final est important pour cibler spécifiquement un répertoire et éviter d’exclure un fichier nommé tmp)
Exclure les fichiers cachés (commençant par .) : --exclude='.*' (Attention, exclut aussi . et .., mais rsync les gère). Souvent, il vaut mieux être plus spécifique si besoin : --exclude='.git/' --exclude='.cache/'
Exclure plusieurs motifs : Répétez l’option --exclude ou utilisez des accolades {} (si votre shell les supporte bien avant que rsync ne les voie) : --exclude={'*.log','tmp/','cache/'} (Syntaxe peut varier). Le plus sûr est de répéter --exclude.
Option --exclude-from=FICHIER : Lit les motifs d’exclusion depuis un fichier texte (un motif par ligne). Très pratique pour les exclusions complexes ou réutilisables.
# --- Préparation --- echo "" echo "--- Préparation Test Exclude ---" mkdir projet_source_excl touch projet_source_excl/code.py touch projet_source_excl/config.yaml mkdir projet_source_excl/data touch projet_source_excl/data/raw_data.csv mkdir projet_source_excl/tmp # Dossier à exclure touch projet_source_excl/tmp/tempfile.tmp touch projet_source_excl/resultat.log # Fichier log à exclure mkdir projet_source_excl/.git # Dossier caché à exclure touch projet_source_excl/.git/config mkdir projet_destination_excl # Créer un fichier d'exclusion echo "*.log" > exclude-list.txt echo "tmp/" >> exclude-list.txt # Exclure le dossier tmp/ echo ".git/" >> exclude-list.txt # Exclure le dossier .git/ echo "--- Structure Source ---" tree projet_source_excl/ echo "--- Fichier d'exclusion (exclude-list.txt) ---" cat exclude-list.txt # --- Simulation avec exclusions via fichier --- echo "" echo "=== Simulation avec --exclude-from=exclude-list.txt ===" rsync -avhn --progress --exclude-from=exclude-list.txt projet_source_excl/ projet_destination_excl/ # --- Exécution réelle --- echo "" echo "=== Exécution réelle avec --exclude-from=exclude-list.txt ===" rsync -avh --progress --exclude-from=exclude-list.txt projet_source_excl/ projet_destination_excl/ echo "--- Structure Destination après copie avec exclusions ---" tree projet_destination_excl/ # Attendu : tmp/, resultat.log, .git/ sont absents # --- Nettoyage --- echo "" echo "--- Nettoyage Test Exclude ---" rm -rf projet_source_excl projet_destination_excl exclude-list.txt
L’option --include=PATTERN est moins fréquente et un peu plus complexe. Elle est surtout utilisée en combinaison avec --exclude pour créer des règles de filtrage plus fines. La règle générale est que les règles include/exclude sont évaluées dans l’ordre où elles sont écrites. La première qui correspond à un fichier/dossier détermine son sort.
Stratégie Courante : Exclure tout (--exclude='*'), puis inclure spécifiquement ce que l’on veut garder.
Pour pouvoir inclure un fichier dans un sous-dossier, il faut aussi inclure les dossiers parents ! On utilise souvent --include='*/' pour inclure tous les répertoires avant d’exclure tous les fichiers.
|
# --- Préparation ---
echo ""
echo "--- Préparation Test Include ---"
mkdir source_incl
touch source_incl/garder.txt
touch source_incl/ignorer.dat
mkdir source_incl/config
touch source_incl/config/settings.yaml # Garder ce fichier
touch source_incl/config/backup.bak # Ignorer celui-ci
mkdir source_incl/data
touch source_incl/data/data.csv # Garder ce fichier
mkdir dest_incl
echo "--- Structure Source ---"
tree source_incl/
# --- Simulation avec include/exclude ---
echo ""
echo "=== Simulation pour ne garder que *.txt, settings.yaml, data.csv ==="
rsync -avhn --progress \
--include='*.txt' \ # Inclure les .txt à la racine
--include='/config/' \ # Inclure le dossier config/ (chemin absolu depuis la source)
--include='/config/settings.yaml' \ # Inclure ce fichier spécifique
--include='/data/' \ # Inclure le dossier data/
--include='/data/data.csv' \ # Inclure ce fichier spécifique
--exclude='*' \ # Exclure TOUT LE RESTE
source_incl/ dest_incl/
# --- Exécution réelle ---
# echo ""
# echo "=== Exécution réelle avec include/exclude ==="
# rsync -avh --progress \
# --include='*.txt' \
# --include='/config/' \
# --include='/config/settings.yaml' \
# --include='/data/' \
# --include='/data/data.csv' \
# --exclude='*' \
# source_incl/ dest_incl/
# echo "--- Structure Destination après inclusion sélective ---"
# tree dest_incl/
# Attendu : garder.txt, config/settings.yaml, data/data.csv
# --- Nettoyage ---
# echo ""
# echo "--- Nettoyage Test Include ---"
# rm -rf source_incl dest_incl
Les règles include/exclude peuvent devenir complexes. Testez abondamment avec --dry-run.
|
a des dizaines d’options. Voici quelques autres options couramment utilisées :rsync
-z ou --compress : Compression
Compresse les données pendant le transfert. Utile sur les réseaux lents (ex: Internet, mauvaise connexion Wi-Fi).
Inutile (voire contre-productif car consomme du CPU) sur un réseau local rapide (Gigabit Ethernet ou plus) ou pour des fichiers déjà compressés (images JPEG, vidéos, fichiers .zip, .gz, .bz2…).
Exemple : rsync -avzh SOURCE user@remote-slow-connection:/destination/
-u ou --update : Mise à jour Sélective
ne mettra pas à jour (n’écrasera pas) un fichier dans la destination si la version de la destination est plus récente (basé sur la date de modification) que celle de la source.rsync
Utile pour rapatrier des fichiers depuis un serveur sans écraser des modifications que vous auriez pu faire localement entre-temps.
Exemple : rsync -avhu user@remote:/projet_partage/ ./mon_projet_local/
--bwlimit=KBPS : Limiter la Bande Passante
Limite la vitesse de transfert à environ KBPS Kilo-octets par seconde.
Utile pour ne pas saturer votre connexion réseau (Internet ou locale) pendant un gros transfert et pouvoir continuer à travailler à côté.
Exemple : Limiter à ~1 Mo/s (1000 Ko/s)
rsync -avh --bwlimit=1000 SOURCE DEST
-b et --backup-dir=REP : Sauvegarder les Fichiers Remplacés/Supprimés
Avec -b, renomme les fichiers qu’il va écraser ou supprimer dans la destination (en ajoutant un rsync ~ par défaut, ou via l’option --suffix=).
Avec --backup-dir=REP, ces fichiers "backup" (ceux qui auraient été modifiés ou supprimés dans la destination) sont déplacés dans le répertoire REP (qui doit exister ou être créé par vos soins) au lieu d’être renommés sur place ou supprimés. Cela permet de garder une version précédente des fichiers.
Exemple : Sauvegarder les fichiers modifiés/supprimés lors d’une synchro dans un dossier daté.
# Répertoire où les anciennes versions seront stockées BACKUP_ROOT="../mes_backups_rsync" BACKUP_DATE=$(date +%Y-%m-%d_%H%M%S) CURRENT_BACKUP_DIR="${BACKUP_ROOT}/${BACKUP_DATE}" mkdir -p "$CURRENT_BACKUP_DIR" # Créer le dossier de backup datéSOURCE_DIR="./donnees_a_sauver/" DEST_DIR="/media/backup_disk/sauvegarde_principale/"echo "Lancement de la sauvegarde avec backup dans $CURRENT_BACKUP_DIR" # -b active le backup, --backup-dir spécifie où mettre les backups # --delete est souvent utilisé conjointement rsync -avhb --delete \ --backup-dir="$CURRENT_BACKUP_DIR" \ "$SOURCE_DIR" "$DEST_DIR"echo "Sauvegarde terminée. Les anciennes versions sont dans $CURRENT_BACKUP_DIR"
Ceci est une forme de sauvegarde versionnée basique. Les fichiers _inchangés_ ne sont pas dupliqués.
Vous voulez sauvegarder votre dossier vers un volume différent monté sur ~/Documents . Vous voulez que la sauvegarde soit un miroir exact et rapide après la première fois./volumes/backup
# Variables pour la clarté
SOURCE_DOCS="${HOME}/Documents/" # Slash final important pour copier le contenu
DEST_BACKUP="/volumes/backup/Sauvegarde_Documents/" # Slash final aussi
# Créer le répertoire de destination s'il n'existe pas
mkdir -p "$DEST_BACKUP"
# *** ÉTAPE 1 : SIMULATION ***
echo ">>> SIMULATION de la sauvegarde des Documents avec --delete <<<"
rsync -avhn --progress --delete "$SOURCE_DOCS" "$DEST_BACKUP"
# *** ÉTAPE 2 : VÉRIFICATION ATTENTIVE DE LA SORTIE DE SIMULATION ***
# Assurez-vous que seuls les fichiers attendus sont marqués pour suppression.
# Si tout est OK :
# *** ÉTAPE 3 : EXÉCUTION RÉELLE ***
echo ">>> EXÉCUTION de la sauvegarde des Documents avec --delete <<<"
# Utiliser -h pour la lisibilité, pas nécessaire pour la simulation
rsync -avh --progress --delete "$SOURCE_DOCS" "$DEST_BACKUP"
# Les fois suivantes, cette commande sera beaucoup plus rapide !
echo "Sauvegarde terminée."
Vos données sont dans et vous voulez les tranférer sur le serveur ./experience1/ dans le répertoire moncluster.fr , en excluant le dossier ~/data/ et les fichiers .git/ . Vous voulez aussi supprimer les anciens fichiers sur le serveur qui ne sont plus dans votre version locale.*.log
SOURCE_WEB="./experience1/" # Slash final pour copier le contenu
DEST_USER="destuser"
DEST_HOST="moncluster.fr" # A adapter
DEST_PATH="~/data/" # Slash final important ici aussi !
# Options d'exclusion
EXCLUDES=(--exclude='.git/' --exclude='*.log')
# Options de base + delete + compression (réseau)
# Utilisation d'un tableau bash pour les exclusions
RSYNC_OPTIONS=(-avzh --progress --delete)
# *** SIMULATION ***
echo ">>> SIMULATION du déploiement avec --delete <<<"
rsync "${RSYNC_OPTIONS[@]}" -n "${EXCLUDES[@]}" "$SOURCE_WEB" "${DEST_USER}@${DEST_HOST}:${DEST_PATH}"
# *** VÉRIFICATION ET EXÉCUTION ***
# Si la simulation montre les bonnes actions (ajouts, mises à jour, suppressions) :
echo ">>> EXÉCUTION du déploiement avec --delete <<<"
rsync "${RSYNC_OPTIONS[@]}" "${EXCLUDES[@]}" "$SOURCE_WEB" "${DEST_USER}@${DEST_HOST}:${DEST_PATH}"
echo "Déploiement terminé."
Vous avez des résultats de calcul dans sur le cluster /scratch/monuser/projet_alpha/output/ . Vous voulez rapatrier dans votre dossier local hpc.univ.fr uniquement les fichiers ./resultats_projet_alpha , .csv et le fichier .png , en ignorant tout le reste (y compris les sous-dossiers non spécifiquement inclus).final_summary.txt
SOURCE_USER="monuser"
SOURCE_HOST="hpc.univ.fr" # A adapter
SOURCE_PATH="/scratch/monuser/projet_alpha/output/" # Slash final
LOCAL_DEST="./resultats_projet_alpha/"
# Créer le dossier local
mkdir -p "$LOCAL_DEST"
# Stratégie : Inclure ce qu'on veut, inclure les répertoires pour pouvoir chercher dedans, exclure tout le reste.
# L'option -m (prune empty dirs) est utile ici pour ne pas créer de dossiers vides.
RSYNC_OPTIONS=(-avhm --progress) # Archive, verbose, human, prune-empty-dirs
# Règles de filtrage
# Important: L'ordre compte ! Inclure d'abord, puis exclure.
FILTER_RULES=(
"--include=*.csv" # Inclure les CSV
"--include=*.png" # Inclure les PNG
"--include=final_summary.txt" # Inclure ce fichier spécifique
"--include=*/" # Inclure les répertoires pour la récursion
"--exclude=*" # Exclure tout le reste
)
# *** SIMULATION ***
echo ">>> SIMULATION de la récupération sélective <<<"
rsync "${RSYNC_OPTIONS[@]}" -n "${FILTER_RULES[@]}" \
"${SOURCE_USER}@${SOURCE_HOST}:${SOURCE_PATH}" "$LOCAL_DEST"
# *** VÉRIFICATION ET EXÉCUTION ***
# Si la simulation ne montre que les fichiers voulus en transfert :
# echo ">>> EXÉCUTION de la récupération sélective <<<"
# rsync "${RSYNC_OPTIONS[@]}" "${FILTER_RULES[@]}" \
# "${SOURCE_USER}@${SOURCE_HOST}:${SOURCE_PATH}" "$LOCAL_DEST"
# echo "Récupération terminée."
rsync c’est bon pour la santé, mangez-en !Puissant et la flexibile, est un outil incontournable pour quiconque travaille avec des fichiers sous Linux, que ce soit pour de simples copies, des sauvegardes robustes ou des synchronisations complexes avec des serveurs distants.rsync
Points Clés à Retenir :
est efficace (ne copie que les différences).rsync
-a (archive) est votre ami pour la plupart des synchronisations de répertoires.
Soyez TRÈS prudent avec le slash / final de la source.
Utilisez -n (--dry-run) systématiquement avant d’exécuter une commande, surtout avec --delete.
--delete est puissant mais dangereux, à utiliser avec une extrême vigilance.
Les options d’exclusion (--exclude) et d’inclusion (--include) sont très pratiques pour filtrer.
La copie distante via SSH est intégrée et sécurisée.
N’hésitez pas à expérimenter (avec --dry-run !) et à consulter le manuel (tapez dans votre terminal) pour découvrir les nombreuses autres options disponibles. Avec un peu de pratique, man rsync deviendra vite un outil indispensable dans votre boîte à outils Linux !rsync
| Option Longue | Option Courte | Description |
|---|---|---|
|
|
Mode archive : récursif, préserve permissions, dates, liens, etc. (équivaut à |
|
|
Augmente la verbosité, montre les fichiers transférés. |
|
|
Copie les répertoires récursivement (inclus dans |
|
|
Affiche les tailles de manière lisible (Ko, Mo, Go). |
|
Affiche la progression pour chaque fichier. |
|
|
|
Simule l’opération sans faire de changements. Essentiel pour tester ! |
|
Supprime les fichiers de la destination qui n’existent pas dans la source. Très dangereux ! |
|
|
Exclut les fichiers/dossiers correspondant au PATTERN. |
|
|
Lit les motifs d’exclusion depuis un fichier. |
|
|
N’exclut pas les fichiers/dossiers correspondant au PATTERN (utile avec |
|
|
|
Compresse les données pendant le transfert (utile sur réseau lent). |
|
|
Ne met pas à jour les fichiers si la destination est plus récente. |
|
|
Spécifie une commande shell distante différente (ex: |
|
Limite la bande passante à KBPS Kilo-octets/seconde. |
|
|
|
Sauvegarde les fichiers remplacés/supprimés (ajoute |
|
Déplace les fichiers sauvegardés (avec |
|
|
|
Copie les liens symboliques comme des liens (inclus dans |
|
|
Préserve les permissions (inclus dans |
|
|
Préserve les dates de modification (inclus dans |
|
|
Donne un résumé des changements fichier par fichier (utile pour comprendre ce qui a été fait). |
|
|
Supprime les chaînes de répertoires vides (utile avec include/exclude). |