Hace algún tiempo, necesitaba comprender el rsync
resultado de un guión que estaba escribiendo. Durante el proceso de escritura de ese script busqué en Google y encontré lo que @mit había escrito arriba . Usé esa información, así como la documentación de otras fuentes, para crear mi propio manual sobre los indicadores de bits y cómo llegar rsync
a los indicadores de bits de salida para todas las acciones (no hace esto de forma predeterminada).
Estoy publicando esa información aquí con la esperanza de que ayude a otros que (como yo) se encuentran con esta página a través de la búsqueda y necesitan una mejor explicación de rsync
.
Con la combinación de la --itemize-changes
bandera y la -vvv
bandera, rsync
nos da una salida detallada de todos los cambios del sistema de archivos que se identificaron en el directorio de origen en comparación con el directorio de destino. Las banderas de bits producidas por rsync
se pueden decodificar para determinar qué cambió. Para decodificar el significado de cada bit, use la siguiente tabla.
Explicación de cada posición de bit y valor en rsync
la salida:
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")
Algunos ejemplos de salida de rsync para varios escenarios:
>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/
Capturando rsync
la salida (enfocada en las banderas de bits):
En mi experimentación, tanto el --itemize-changes
indicador como el -vvv
indicador son necesarios rsync
para generar una entrada para todos los cambios del sistema de archivos. Sin el -vvv
indicador triple verbose ( ), no veía los cambios de directorio, enlace y dispositivo en la lista. Vale la pena experimentar con su versión de rsync para asegurarse de que está observando y anotando todo lo que esperaba.
Un uso útil de esta técnica es agregar la --dry-run
bandera al comando y recopilar la lista de cambios, según lo determinado por rsync, en una variable (sin realizar ningún cambio) para que pueda procesar la lista usted mismo. Algo como lo siguiente capturaría la salida en una variable:
file_system_changes=$(rsync --archive --acls --xattrs \
--checksum --dry-run \
--itemize-changes -vvv \
"/some/source-path/" \
"/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')
En el ejemplo anterior, la salida (stdout) de rsync
se redirige a grep
(a través de stdin) para que podamos aislar solo las líneas que contienen indicadores de bits.
Procesando la salida capturada:
El contenido de la variable se puede registrar para su uso posterior o se puede iterar inmediatamente para los elementos de interés. Utilizo esta táctica exacta en el guión que escribí mientras investigaba más rsync
. Puede consultar el script ( https://github.com/jmmitchell/movestough ) para ver ejemplos de posprocesamiento de la salida capturada para aislar archivos nuevos, archivos duplicados (mismo nombre, mismo contenido), colisiones de archivos (mismo nombre, diferentes contenidos), así como los cambios en las estructuras de subdirectorios.