¿Cómo puedo verificar si rsync realizó algún cambio en bash?


12

Tengo un script que usa rsync para sincronizar datos en un escenario remoto -> local. Inmediatamente después de ejecutar el comando rsync, verifique si el código de error es igual a cero o no. Si es cero, se realizan más comandos. Sin embargo, esto no tiene en cuenta el hecho de que rsync podría haberse ejecutado con éxito pero en realidad no ha realizado ningún cambio. Debido a esto, la condición igual a cero se ejecutará independientemente, lo cual es un poco redundante.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

¿Cuál sería el mejor enfoque para expandir esto para verificar si realmente hubo algún cambio basado en el comando rsync que se ejecutó? He leído que el indicador -i puede proporcionar salida a stdout, pero ¿cómo se puede colocar esto en un bloque condicional?


Has -ventrado allí, por lo que ya está proporcionando la información que necesitas para stdout ... por ejemplo, una lista de archivos que realmente se enviaron. Si nada cambia, eso es justo ./.
Ricitos

Ah! ¿Qué sucede si eliminé -v y utilicé -i en su lugar y luego utilicé una comprobación de cadena no vacía en el comando rsync?
James White

¿Parece que encontraste la solución tú mismo? :-)
Bjorn Munch

2
puedes usar a=$("rsync command"). Esto sería ejecutar el rsynccomando y almacenar stdouten a. Entonces puede ejecutar pruebas ena
nitishch

1
También puede agregar un | grep /o algo así, luego verificar el estado de salida de grep con $?, debería ser 1 si no hubo salida.
Bjorn Munch

Respuestas:


9

Según los comentarios a mi pregunta original, realice la salida de rsync para stdout con el indicador -i y use una condición de verificación sin cadena para ver si algo realmente cambió dentro de la verificación del código de error. Ajustar el comando rsync en una variable permite realizar la verificación.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

Posible inconveniente, debe perder el resultado detallado, pero siempre puede registrarlo en un archivo.


1

Quería una solución más estricta. No quiero pelear porNumber of created files: (el mensaje podría estar en otro idioma) o eliminar todas las líneas excepto dos en la -vsalida (¿quién sabe qué resumen rsyncse imprimirá en la próxima versión?).

Descubrí que puede establecer el formato del rsyncregistro de a, pero no el formato de su stdout (veaman rsyncd.conf ).

Por ejemplo, agregue un "¡Archivo cambiado!" a cada línea con un archivo realmente cambiado, y luego greppara ello:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.