rsync
est un outil de copie de fichiers très polyvalent. Il est surtout connu pour sa capacité à copier des fichiers depuis, ou vers, un shell distant mais aussi pour son algorithme de comparaison qui permet de ne transférer que les fichiers modifiés.
Utilisation de base
La commande s'utilise très simplement avec une signature proche de la commande cp
.
rsync -av SOURCE DEST
La drapeau -a
ou --archive
est un racourci vers les drapeaux -rlptgoD
, et correspond souvent à ce que l'on souhaite faire avec rsync :
-r
pour une copie récursive (dossiers)-l
copie les liens symboliques.-p
conserve les permissions.-t
conserve les date de modifications (nécessaire au bon fonctionnement de l'algorythme de différence).-g
conserve le groupe auquel appartient le fichier.-o
conserve le propriétaire auquel appartient le fichier.-D
préserve les fichiers spéciaux et les fichier devices.
Le drapeau -v
permet simplement une sortie plus "verbeuse" qui permettra de mieux comprendre les opérations effectuées par rsync
.
En revanche, il faudra faire attention à votre manière d'écrire le chemin source. Si ce chemin finit par un /
les fichiers (et les dossiers) à l'intérieur de la source seront copiés, sinon le dossier sera copié à l'intérieur du dossier de destination. Le drapeau -n
ou --dry-run
peut vous permettre de "simuler" les opérations faites par rsync et de vous assurer de ne pas faire de bétises. La commande peut aussi être utilisée pour une copie vers un dossier distant.
rsync -av ./MonApplication demo@domain.com:~/MonSite
# Ou dans le cas d'un port ssh non standart
rsync -av ./MonApplication -e 'ssh -p 3333' demo@domain.com:~/MonSite
En revanche, si un fichier n'est pas présent dans le dossier source, il ne sera pas supprimé sur le dossier distant. Si vous souhaitez obtenir ce comportement il vous faudra utiliser le drapeau --delete
(je vous conseille alors de faire un --dry-run
afin de vous assurer de l'étendu de la suppression).
Exclure des fichiers
Si vous souhaitez déployer (ou sauvegarder) une application web avec rsync il est possible de spécifier les fichiers à exclure via le drapeau --exclude
.
rsync -a --exclude=*.sql --exclude=.env --exclude=.git ./MonApplication demo@domain.com:~/MonSite
Inversement, le drapeau --include
vous permet de réinclure des fichiers que vous auriez exclue préalablement. Vous pouvez aussi utiliser des fichiers pour lister ces éléments à l'aide des drapeaux --include-from
et --exclude-from
.
Compresser ou non ?
Si vous copiez des fichiers assez important il peut être intéréssant de les compresser afin de les alléger pour le transfert avec -z
. En revanche, cette opération a un coût au niveau des performances pour la machine source qui devra compresser les fichiers, et la machine cible qui devra les décompresser. Si vous ne copiez pas de fichiers volumineux ou que vous copier une archive déjà compressée ce drapeau peut être omit.
Enfin, toujours dans le cas de fichiers volumineux vous pouvez utiliser le drapeau -P
qui est un racourci vers --progress
et --partials
.