Cette antisèche rsync met tout en haut les recettes que vous lancez vraiment : copier un dossier à l'identique, l'envoyer via ssh, et la simulation à faire avant tout ce qui détruit. Copiez la ligne, changez vos chemins, allez-y. rsync ne copie que ce qui a changé, donc le deuxième passage est rapide, et un transfert à moitié fait peut reprendre au lieu de tout recommencer. Le pénible dans rsync, ça n'a jamais été les options. C'est un minuscule détail au bout du chemin source, le slash final, qui change discrètement le sens de toute la commande, et il a sa propre section plus bas.
The short answer
Copiez un dossier à l'identique avec rsync -av src/ dst/, copiez via ssh avec rsync -avz src/ user@host:/dst/,
et rendez la destination un miroir exact avec rsync -av --delete src/ dst/. Simulez toujours
d'abord avec rsync -avn src/ dst/, reprenez un gros transfert avec rsync -avP src/ dst/, et souvenez-vous
qu'un slash final sur la source copie le contenu alors que sans slash ça copie le dossier lui-même.
Vous voulez copier un dossier vers un autre dossier, ou vers une autre machine, et vous voulez que ça reprenne là où ça s'est arrêté quand le wifi lâche. C'est rsync. Les recettes que vous tapez vraiment sont tout en haut : copier un dossier à l'identique, l'envoyer via ssh, et la simulation à lancer avant tout ce qui détruit. Copiez la ligne, changez vos chemins, allez-y. Le pénible dans rsync, ça n'a jamais été les options. C'est un minuscule détail au bout du chemin source qui change discrètement le sens de toute la commande.
Un repère avant de scroller. rsync ne copie que ce qui a changé, donc le deuxième passage est rapide, et un transfert à moitié fait peut reprendre au lieu de tout recommencer. Le piège que personne ne mentionne le premier jour, c'est ce slash final, qui a sa propre section plus bas parce que franchement, c'est la seule partie de rsync qui mérite qu'on soit un peu nerveux.
Copier un dossier en local
Celle que vous taperez le plus. rsync -av src/ dst/ copie tout depuis src/ dans dst/ et garde les métadonnées intactes. Le -a veut dire archive, qui est en fait un paquet : descendre dans les sous-dossiers, préserver permissions, dates, liens symboliques, tout. Relancez-la demain et seuls les fichiers modifiés bougent. Cette rapidité au deuxième passage, c'est toute la raison pour laquelle les gens prennent rsync plutôt qu'un simple cp.
| Recette | Ce qu'elle fait |
|---|---|
rsync -av src/ dst/ | Copie le contenu de src/ dans dst/, métadonnées préservées |
rsync -av src dst/ | Notez le slash manquant : copie le dossier lui-même, qui atterrit en dst/src/ |
rsync -avh src/ dst/ | Pareil, mais tailles lisibles dans la sortie (h) |
rsync -a src/ dst/ | Version silencieuse, sans bavardage fichier par fichier. Bien pour le cron |
Vous voyez l'écart entre les deux premières lignes ? Un slash. Avec src/ vous copiez ce qui est dans src. Sans, src va dans dst comme sous-dossier. Je me trompe encore là-dessus parfois, et c'est exactement pour ça que je commence par la simulation plus bas.
Copier via ssh vers une autre machine
C'est là que rsync gagne sa place. Mettez user@host: devant un chemin et rsync passe par ssh, sans rien à configurer si vous pouvez déjà vous connecter à la machine. Ajoutez z et il compresse le flux, ce qui compte sur tout ce qui est plus lent qu'un réseau local. Les mêmes règles de sens s'appliquent : source d'abord, destination ensuite, et ce slash final décide toujours contenu contre dossier.
| Recette | Ce qu'elle fait |
|---|---|
rsync -avz src/ user@host:/dst/ | Envoyer un dossier local vers un chemin distant, compressé |
rsync -avz user@host:/src/ dst/ | Récupérer dans l'autre sens : distant vers local |
rsync -avzP src/ user@host:/dst/ | Envoyer avec une barre de progression et reprise des partiels (le P) |
rsync -avz --delete src/ user@host:/dst/ | Envoyer et copier à l'identique, en supprimant côté distant ce qui n'est pas dans src |
Le z est un choix, pas un cadeau gratuit. Sur un réseau local rapide, il peut carrément vous ralentir, parce que le processeur passe du temps à compresser des données que le lien aurait juste transportées. Par contre, sur internet ou un VPN, activez-le. Si vous préférez ne pas assembler tout ça à la main, notre générateur de commande rsync construit la ligne exacte en quelques clics, cible ssh comprise.
Simuler avant de changer quoi que ce soit
L'option qui m'a sauvé plus que toutes les autres. -n (forme longue --dry-run) fait passer rsync par tout le déroulé et annonce chaque fichier qu'il toucherait, sans rien écrire sur le disque. Associez-la à -v pour pouvoir lire la liste pour de vrai. Ça vous coûte deux secondes et c'est la différence entre rattraper une faute de frappe dans un chemin et expliquer à quelqu'un pourquoi ses données ont disparu.
| Recette | Ce qu'elle fait |
|---|---|
rsync -avn src/ dst/ | Prévisualiser une copie normale, sans rien toucher (n = simulation) |
rsync -av --dry-run src/ dst/ | Exactement la même chose, écrite en toutes lettres avec --dry-run |
rsync -avn --delete src/ dst/ | La cruciale : voir ce que --delete supprimerait avant qu'il le fasse |
Cette dernière ligne, c'est l'habitude à prendre. Dès que --delete est dans la commande, lancez-la une fois avec -n d'abord et lisez les suppressions à voix haute s'il le faut. rsync va joyeusement aligner une source vide sur une destination pleine, et c'est une façon d'effacer un dossier en une ligne. La simulation transforme cette mine en une liste que vous pouvez vérifier.
rsync -avn --delete src/ dst/ Rendre une destination identique à la source
Un rsync normal ne fait qu'ajouter et mettre à jour. Il n'enlève jamais rien de la destination, donc les fichiers que vous avez supprimés dans la source restent de l'autre côté pour toujours. --delete corrige ça en faisant de la destination un vrai miroir : tout ce qui est dans dst mais pas dans src est enlevé. Les vraies sauvegardes et les vrais déploiements veulent généralement ça. Respectez-le, simplement.
| Recette | Ce qu'elle fait |
|---|---|
rsync -av --delete src/ dst/ | Faire de dst/ un miroir exact, en supprimant les extras |
rsync -avn --delete src/ dst/ | Simulez d'abord (faites-le à chaque fois) |
rsync -av --delete --exclude='.git' src/ dst/ | Miroir, mais protège aussi les chemins correspondants de la suppression |
Le danger, ce n'est pas --delete en soi, c'est --delete plus un mauvais chemin source. Pointez-le sur un dossier vide ou mal tapé et il vide consciencieusement la destination pour qu'elle corresponde. Pas de corbeille ici, pas d'annulation. Ce qui est tout l'argument pour la simulation.
Mon avis : tapez -avn avant de taper le moindre --delete. Deux avis bien tranchés, et je plante mon drapeau sur les deux. Premièrement :
rsync -avest le bon défaut pour à peu près tout, local ou distant, parce que le mode archive garde les métadonnées dont vous ignoriez tenir jusqu'à ce qu'elles manquent. Deuxièmement, et plus fort : ne lancez jamais--deleteà l'aveugle. Lancez la commande identique avec-najouté, lisez ce qu'il compte enlever, puis retirez lenet lancez-la pour de vrai. Cette commande en plus m'a rattrapé un mauvais chemin plus d'une fois, un soir fatigué, juste avant que ça compte. Le slash final, c'est la règle qui a brûlé littéralement tous ceux qui utilisent cet outil, moi compris, donc la simulation est aussi votre assurance anti-faute-de-slash. La nuance, parce que j'essaie d'être honnête : sur un réseau local rapide, la compressionzpeut ralentir au lieu d'accélérer, donc celle-là dépend vraiment du contexte. Testez sur votre propre lien au lieu de la suivre par réflexe.
Ignorer les fichiers que vous ne voulez pas copier
Vous voulez rarement tout. Les logs, les caches, le dossier .git, les déchets de build. --exclude prend un motif et laisse les fichiers correspondants hors du transfert. Vous pouvez en empiler plusieurs, et les motifs marchent comme des jokers du shell, donc '*.log' attrape tous les fichiers log à n'importe quelle profondeur.
| Recette | Ce qu'elle fait |
|---|---|
rsync -av --exclude='*.log' src/ dst/ | Ignore chaque fichier .log pendant la copie |
rsync -av --exclude='*.log' --exclude='cache/' src/ dst/ | Empile plusieurs exclusions, fichiers et dossiers |
rsync -av --exclude-from=skip.txt src/ dst/ | Lit une liste de motifs depuis un fichier, un par ligne |
Mettez le motif entre guillemets. '*.log' entre apostrophes arrive intact à rsync ; sans les guillemets, votre shell risque de développer le * dans votre dossier courant d'abord, une façon déroutante d'obtenir le mauvais résultat. Quand la liste d'exclusions dépasse deux ou trois, mettez-la dans un fichier avec --exclude-from.
Afficher la progression et reprendre les transferts partiels
Les gros transferts et les connexions capricieuses, c'est pour ça que -P existe. C'est deux choses boulonnées ensemble : --progress pour une barre de progression vivante par fichier, et --partial pour qu'un fichier interrompu soit gardé au lieu d'être jeté. Coupez le transfert à mi-chemin, relancez la même commande, et rsync continue d'où il s'est arrêté au lieu de refaire des gigaoctets.
| Recette | Ce qu'elle fait |
|---|---|
rsync -avP src/ dst/ | Barre de progression plus garder les fichiers partiels pour reprendre |
rsync -avzP src/ user@host:/dst/ | Pareil via ssh, compressé, le réflexe pour les grosses copies distantes |
rsync -av --partial src/ dst/ | Juste la moitié reprise, sans barre de progression (pratique en script) |
C'est celle qui ressemble à un super-pouvoir la première fois qu'un transfert meurt à 80 pour cent et que vous le relancez, point. Pour une copie de plusieurs gigaoctets sur un lien branlant, -avzP est en gros mon défaut.
Utiliser ssh sur un port personnalisé (ou avec des options)
Plein de serveurs ne sont pas sur le port 22. L'option -e vous laisse passer à rsync la commande ssh exacte à utiliser, port compris. Mettez-la entre guillemets parce qu'il y a un espace dedans, et vous pouvez y caser n'importe quelle option ssh : un autre port, un fichier d'identité, ce dont votre config a besoin.
| Recette | Ce qu'elle fait |
|---|---|
rsync -av -e "ssh -p 2222" src/ host:/dst/ | Lancer rsync via ssh sur le port 2222 au lieu de 22 |
rsync -av -e "ssh -i ~/.ssh/deploy" src/ host:/dst/ | Utiliser un fichier d'identité précis pour la connexion |
rsync -avz -e "ssh -p 2222" src/ user@host:/dst/ | Port personnalisé et compression, la combinaison réaliste |
Les guillemets piègent les gens. -e "ssh -p 2222" doit être une seule chaîne entre guillemets, parce que rsync a besoin du tout comme un seul argument. Enlevez les guillemets et le shell le découpe, et rsync ne sait plus ce qui est une option et ce qui est un chemin. Une fois entre guillemets, n'importe quelle option ssh marche très bien là-dedans.
Le slash final qui piège tout le monde
J'ai gardé le vrai piège pour la fin, parce qu'il mérite sa propre section. Sur le chemin source, un slash final veut dire « le contenu de ce dossier ». Pas de slash final veut dire « ce dossier, en tant que chose ». Ce seul caractère change où vos fichiers finissent, et c'est de loin l'erreur rsync la plus fréquente.
| Recette | Ce qu'elle fait |
|---|---|
rsync -a src/ dst/ | Copie le contenu de src, donc les fichiers atterrissent direct dans dst/ |
rsync -a src dst/ | Copie le dossier, donc vous obtenez dst/src/... à la place |
Lisez ces deux lignes jusqu'à ce que ça rentre. Vous voulez les fichiers dans la destination ? Slash final sur la source. Vous voulez le dossier imbriqué dans la destination ? Enlevez-le. Le slash de la destination compte à peine ici, c'est celui de la source qui décide tout. Ne faites jamais confiance à votre mémoire là-dessus. Je ne fais pas confiance à la mienne.
Et après
Voilà la trousse de travail. Copier en local, copier via ssh, simuler avant tout ce qui détruit, --delete pour un miroir exact, --exclude pour ignorer les déchets, -P pour reprendre, -e pour un port ssh personnalisé, et la règle du slash final qui relie le tout. Ça couvre vraiment presque tout ce que je fais avec rsync dans une semaine normale, et le cas tordu que je recherche comme tout le monde.
Si vous vivez de toute façon dans le shell, le même réflexe paie juste à côté. Vous empaquetez des fichiers pour un transfert ? L'antisèche de la commande tar regroupe créer et extraire de la même façon. Vous cherchez d'abord des fichiers par nom ou par taille ? Voyez l'antisèche de la commande find. Et quand vous tripotez des connexions ou que vous vous demandez pourquoi un transfert traîne, nos commandes réseau Linux avec ip et ss couvrent le côté interfaces-et-sockets du même boulot.
Sources
Questions fréquentes
À quoi sert le slash final dans rsync ?
Sur le chemin source, un slash final veut dire copier le contenu du dossier, donc les fichiers atterrissent directement dans la destination. Sans slash final, ça copie le dossier lui-même, qui finit imbriqué comme sous-dossier de la destination. Donc rsync -a src/ dst/ met les fichiers de src direct dans dst, alors que rsync -a src dst/ crée d'abord dst/src. C'est l'erreur rsync la plus fréquente, donc lancez une simulation avec -n et vérifiez où les chemins pointent avant de valider.
Comment copier un dossier vers un serveur distant avec rsync ?
Mettez user@host devant le chemin distant : rsync -avz src/ user@host:/dst/. Le -a préserve permissions et dates, -v affiche ce qui bouge, et z compresse les données sur le réseau, ce qui aide sur internet. Ça passe par ssh automatiquement, donc si vous pouvez déjà vous connecter à la machine, rien d'autre à configurer. Ajoutez P pour une barre de progression et la reprise, ce que vous voulez sur tout ce qui est volumineux.
Quelle différence entre rsync avec et sans --delete ?
Sans --delete, rsync ne fait qu'ajouter et mettre à jour, donc ce que vous avez retiré de la source traîne encore sur la destination. Avec --delete, la destination devient un miroir exact : les fichiers absents de la source sont enlevés eux aussi. Utilisez-le pour les vraies sauvegardes et déploiements où vous voulez les deux côtés identiques. Simulez-le toujours d'abord avec rsync -avn --delete pour voir exactement ce qui serait enlevé avant que ça arrive.
Comment reprendre un transfert rsync interrompu ?
Utilisez l'option -P, comme dans rsync -avP src/ dst/. Elle combine --progress pour une barre de progression vivante et --partial, qui garde les fichiers partiellement transférés au lieu de les jeter. Si la connexion lâche, relancez juste la même commande et rsync continue d'où il s'est arrêté au lieu de recommencer tout le transfert. Pour les grosses copies via ssh, rsync -avzP src/ user@host:/dst/ est la combinaison habituelle.
Comment utiliser rsync via ssh sur un port non standard ?
Passez la commande ssh avec -e et mettez-la entre guillemets : rsync -av -e 'ssh -p 2222' src/ host:/dst/ se connecte sur le port 2222 au lieu de 22. Les guillemets comptent parce que rsync a besoin de toute la commande ssh comme un seul argument. Vous pouvez y mettre n'importe quelle option ssh de la même façon, comme -e 'ssh -i ~/.ssh/deploy' pour choisir un fichier d'identité précis. Combinez-le avec z pour compresser quand vous copiez sur internet.