Il y a quelque temps, j'avais besoin de comprendre la rsync
sortie d'un script que j'écrivais. Pendant le processus d'écriture de ce script, j'ai cherché sur Google et je suis arrivé à ce que @mit avait écrit ci-dessus . J'ai utilisé ces informations, ainsi que la documentation d'autres sources, pour créer mon propre amorce sur les indicateurs de bits et comment obtenir rsync
des indicateurs de bits de sortie pour toutes les actions (il ne le fait pas par défaut).
Je publie ces informations ici dans l'espoir que cela aide d'autres personnes qui (comme moi) tombent sur cette page via la recherche et ont besoin d'une meilleure explication rsync
.
Avec la combinaison de l' --itemize-changes
indicateur et de l' -vvv
indicateur, rsync
nous donne une sortie détaillée de toutes les modifications du système de fichiers qui ont été identifiées dans le répertoire source par rapport au répertoire cible. Les indicateurs binaires produits par rsync
peuvent ensuite être décodés pour déterminer ce qui a changé. Pour décoder la signification de chaque bit, utilisez le tableau suivant.
Explication de chaque position de bit et valeur dans rsync
la sortie de:
YXcstpoguax path/to/file
|||||||||||
||||||||||╰- x: The extended attribute information changed
|||||||||╰-- a: The ACL information changed
||||||||╰--- u: The u slot is reserved for future use
|||||||╰---- g: Group is different
||||||╰----- o: Owner is different
|||||╰------ p: Permission are different
||||╰------- t: Modification time is different
|||╰-------- s: Size is different
||╰--------- c: Different checksum (for regular files), or
|| changed value (for symlinks, devices, and special files)
|╰---------- the file type:
| f: for a file,
| d: for a directory,
| L: for a symlink,
| D: for a device,
| S: for a special file (e.g. named sockets and fifos)
╰----------- the type of update being done::
<: file is being transferred to the remote host (sent)
>: file is being transferred to the local host (received)
c: local change/creation for the item, such as:
- the creation of a directory
- the changing of a symlink,
- etc.
h: the item is a hard link to another item (requires
--hard-links).
.: the item is not being updated (though it might have
attributes that are being modified)
*: means that the rest of the itemized-output area contains
a message (e.g. "deleting")
Quelques exemples de sortie de rsync pour divers scénarios:
>f+++++++++ some/dir/new-file.txt
.f....og..x some/dir/existing-file-with-changed-owner-and-group.txt
.f........x some/dir/existing-file-with-changed-unnamed-attribute.txt
>f...p....x some/dir/existing-file-with-changed-permissions.txt
>f..t..g..x some/dir/existing-file-with-changed-time-and-group.txt
>f.s......x some/dir/existing-file-with-changed-size.txt
>f.st.....x some/dir/existing-file-with-changed-size-and-time-stamp.txt
cd+++++++++ some/dir/new-directory/
.d....og... some/dir/existing-directory-with-changed-owner-and-group/
.d..t...... some/dir/existing-directory-with-different-time-stamp/
Capture de rsync
la sortie (axée sur les indicateurs de bits):
Dans mon expérimentation, l' --itemize-changes
indicateur et l' -vvv
indicateur sont nécessaires pour obtenir rsync
une entrée pour toutes les modifications du système de fichiers. Sans l' -vvv
indicateur triple verbose ( ), je ne voyais pas les changements de répertoire, de lien et de périphérique répertoriés. Il vaut la peine d'expérimenter votre version de rsync pour vous assurer qu'elle observe et note tout ce que vous attendiez.
Une utilisation pratique de cette technique consiste à ajouter l' --dry-run
indicateur à la commande et à collecter la liste de modifications, telle que déterminée par rsync, dans une variable (sans apporter de modifications) afin que vous puissiez effectuer vous-même certains traitements sur la liste. Quelque chose comme ce qui suit capturerait la sortie dans une variable:
file_system_changes=$(rsync --archive --acls --xattrs \
--checksum --dry-run \
--itemize-changes -vvv \
"/some/source-path/" \
"/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')
Dans l'exemple ci-dessus, la sortie (stdout) de rsync
est redirigée vers grep
(via stdin) afin que nous puissions isoler uniquement les lignes qui contiennent des indicateurs de bits.
Traitement de la sortie capturée:
Le contenu de la variable peut ensuite être consigné pour une utilisation ultérieure ou immédiatement répété pour les éléments d'intérêt. J'utilise cette tactique exacte dans le script que j'ai écrit pendant mes recherches rsync
. Vous pouvez consulter le script ( https://github.com/jmmitchell/movestough ) pour des exemples de post-traitement de la sortie capturée pour isoler de nouveaux fichiers, des fichiers en double (même nom, même contenu), des collisions de fichiers (même nom, différents contents), ainsi que les changements dans les structures des sous-répertoires.