Il y a quelque temps, j'avais besoin de comprendre le rsync
pour un script que j'étais en train d'écrire. Pendant le processus d'écriture de ce script, j'ai fait des recherches sur Internet et je suis tombé sur ce que @mit avait écrit au-dessus de . J'ai utilisé ces informations, ainsi que des documents provenant d'autres sources, pour créer mon propre guide d'introduction aux drapeaux binaires et à la manière de les obtenir. rsync
pour sortir les drapeaux de bits pour toutes les actions (il ne le fait pas par défaut).
Je publie cette information ici dans l'espoir d'aider d'autres personnes qui (comme moi) tombent sur cette page par le biais d'une recherche et qui ont besoin d'une meilleure explication sur le sujet. rsync
.
Avec la combinaison de la --itemize-changes
drapeau y el -vvv
drapeau, rsync
nous donne une sortie détaillée de tous les changements de système de fichiers qui ont été identifiés dans le répertoire source par rapport au répertoire cible. Les indicateurs binaires produits par rsync
peut alors être décodé pour déterminer ce qui a changé. Pour décoder la signification de chaque bit, utilisez le tableau suivant.
Explication de la position et de la valeur de chaque bit dans l'écran. rsync
La sortie de l'entreprise :
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 différents 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/
Capturer rsync
(en se concentrant sur les drapeaux binaires) :
Dans mon expérience, les deux --itemize-changes
drapeau y el -vvv
sont nécessaires pour obtenir rsync
pour produire une entrée pour todo les modifications du système de fichiers. Sans le triple verbe ( -vvv
), je ne voyais pas les changements de répertoire, de lien et de périphérique répertoriés. Cela vaut la peine d'expérimenter avec 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'option --dry-run
à la commande et rassemble la liste des modifications, telle que déterminée par rsync, dans une variable (sans effectuer de modifications) afin que vous puissiez effectuer vous-même des traitements sur cette 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 l'application rsync
est redirigé vers grep
(via stdin) afin que nous puissions isoler uniquement les lignes qui contiennent des drapeaux de bits.
Traitement de la sortie capturée :
Le contenu de la variable peut alors être enregistré pour une utilisation ultérieure ou être immédiatement itéré pour trouver des éléments intéressants. J'utilise cette tactique exacte dans le script que j'ai écrit pendant que je faisais des recherches plus approfondies sur rsync
. Vous pouvez regarder le script ( https://github.com/jmmitchell/movestough ) pour des exemples de post-traitement de la sortie capturée afin d'isoler les nouveaux fichiers, les fichiers dupliqués (même nom, même contenu), les collisions de fichiers (même nom, contenu différent), ainsi que les changements dans les structures de sous-répertoires.