Obtener lista de archivos transferidos de rsync?

14

Actualmente estoy usando rsyncun script que implementa una aplicación PHP desde una puesta en escena a un servidor de producción. Aquí es cómo:

rsync -rzai --progress --stats --ignore-times --checksum /tmp/app_export/ root@app.com:/var/www/html/app/

Actualmente, esto genera una lista de cada archivo que se está comparando (cada archivo del proyecto), pero me gustaría que solo muestre los modificados, por lo que puedo ejecutarlo con una --dry-runopción para verificar que cada implementación solo actualice archivos deseados

NOTA: Lo mejor que puedo hacer hasta ahora son grep fcstlos resultados, pero estoy buscando una rsyncopción que estoy seguro de que está allí, pero no la encuentro en las páginas del manual.

¡Gracias por adelantado!

Mauro
fuente

Respuestas:

6

Si hay una opción rsync para hacer exactamente lo que está pidiendo, tampoco la encontré en la página de manual. :-)

Dicho esto, no veo el problema con grepping la salida de rsync -ianalizar exactamente lo que necesita. Eso se siente bien y Unixy para mí.

Una objeción quisquillosa con su comando rsync: el -res redundante, como lo implica -a.

Kevin DeGraaf
fuente
2
Gracias hombre. Me pregunto por qué (con la variedad de opciones que tiene este programa) no hay una opción para eso. Parece bastante básico para mí.
Mauro
Hola Kevin, en realidad hay una opción: el -Pprogreso hace exactamente eso en la -nconfiguración de ejecución en seco, aunque -itampoco está mal. Vea mi respuesta a continuación.
Robert Riedl
6

Usa la --out-formatopción

Según la página del manual:

Al especificar la --out-formatopción, se mencionará cada archivo, directorio, etc. que se actualice de manera significativa (un archivo transferido, un enlace simbólico / dispositivo recreado o un directorio).

Si solo necesita los nombres de archivo reales ( --out-format="%n"), su comando de ejecución en seco podría verse así:

rsync -rzan --out-format="%n" --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/


Cuando se llama a rsync con -v, utiliza internamente esta opción con un formato predeterminado de "%n%L", que le indica solo el nombre del archivo y, si el elemento es un enlace, dónde apunta.

Pero esto también incluye un breve resumen al principio y al final del proceso de sincronización.

Para deshacerse de ese resumen, use la --out-formatopción directamente.

Por cierto. -iTambién utiliza internamente --out-format, pero con un formato de "%i %n%L".

gripe
fuente
3

A partir de rsync v3.1.0, lanzado en 2013, existe el --infoindicador que permite un control detallado sobre la salida.

 --info=FLAGS
          This option lets you have fine-grained control over the information output you want to see.  An individual flag name may be followed
          by a level number, with 0 meaning to silence that output, 1 being the default output level, and higher numbers increasing the output
          of that flag (for those that support higher levels).  Use --info=help to see all the available flag names,  what  they  output,  and
          what flag names are added for each increase in the verbose level.  Some examples:

              rsync -a --info=progress2 src/ dest/
              rsync -avv --info=stats2,misc1,flist0 src/ dest/

          Note  that  --info=names  output  is  affected  by the --out-format and --itemize-changes (-i) options.  See those options for more
          information on what is output and when.

          This option was added to 3.1.0, so an older rsync on the server side might reject your attempts at fine-grained control (if  one  or
          more  flags  needed  to  be  send to the server and the server was too old to understand them).  See also the "max verbosity" caveat
          above when dealing with a daemon.

Las --infobanderas disponibles son:

Use OPT or OPT1 for level 1 output, OPT2 for level 2, etc.; OPT0 silences.

BACKUP     Mention files backed up
COPY       Mention files copied locally on the receiving side
DEL        Mention deletions on the receiving side
FLIST      Mention file-list receiving/sending (levels 1-2)
MISC       Mention miscellaneous information (levels 1-2)
MOUNT      Mention mounts that were found or skipped
NAME       Mention 1) updated file/dir names, 2) unchanged names
PROGRESS   Mention 1) per-file progress or 2) total transfer progress
REMOVE     Mention files removed on the sending side
SKIP       Mention files that are skipped due to options used
STATS      Mention statistics at end of run (levels 1-3)
SYMSAFE    Mention symlinks that are unsafe

ALL        Set all --info options (e.g. all4)
NONE       Silence all --info options (same as all0)
HELP       Output this help message

Options added for each increase in verbose level:
1) COPY,DEL,FLIST,MISC,NAME,STATS,SYMSAFE
2) BACKUP,MISC2,MOUNT,NAME2,REMOVE,SKIP
Corneliu
fuente
1
Esto es asombroso, gracias. No tenía idea de que este indicador existía porque uso una Mac, incluso la última MacOS instala una versión rsync de 2004 jajaja. Cheers Apple ...
twistedpixel
0

No estoy seguro si esto difiere entre las versiones / opciones utilizadas, pero en mi versión cuando uso la -iopción obtengo una lista como:

>f..T...... existing-file.png
>f+++++++++ new-file.png
cd+++++++++ new-dir/
>f+++++++++ new-dir/new-file.png

Entonces, una solución simple para obtener solo una lista de archivos realmente transferidos simplemente se ejecuta:

rsync [your options here] | grep -v "f..T......"

Esto simplemente ocultará todas las líneas que contengan f..T....... Así que efectivamente esto ocultará archivos idénticos.

Nux
fuente
0

En realidad, respondiste tu propia pregunta, ya que tu comando original ya la tiene: --progress

Esta es la opción correcta, aunque la página del manual es un poco críptica al respecto:

     --progress              show progress during transfer
 -P                          same as --partial --progress

Tiene un poco de sentido, ya que invoca su rsynccadena con el modo de ejecución en seco, no ocurre ningún transer, pero aún tendría progreso: es decir, los archivos que han cambiado y se transferirán.

De esta manera obtienes una pequeña lista de todos los archivos, por ejemplo:

El destino ya tiene una copia del archivo modificado que se actualizó en el archivo fuente y antiguo, que permanece sin cambios. La fuente también tiene un archivo adicional: newfile.

#~$ ls -lhan /tmp/destination/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:08 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile



#~$ ls -lhan /tmp/source/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:15 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 newfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile

Si luego invocamos su comando rsync, pero eliminamos los elementos -iy simplemente agregamos dryrun-n

#~$ ~$ rsync -n -rza --progress --stats --ignore-times --checksum /tmp/source/ /tmp/destination/
sending incremental file list
changedfile
newfile

Number of files: 4 (reg: 3, dir: 1)
Number of created files: 1 (reg: 1)
Number of deleted files: 0
Number of regular files transferred: 2
Total file size: 2 bytes
Total transferred file size: 2 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 187
Total bytes received: 22

sent 187 bytes  received 22 bytes  418.00 bytes/sec
total size is 2  speedup is 0.01 (DRY RUN)

Obtiene una lista de solo los archivos que rsync podría transferir: archivo cambiado y archivo nuevo.

Robert Riedl
fuente