Obtenga rsync para informar si se actualizó algún archivo local

Obtenga rsync para informar si se actualizó algún archivo local

Estoy ejecutando rsync para realizar extracción desde un host remoto al host local.

rsync -a --update user@remotehost:/files/ ~/files/

Estoy ejecutando ese comando desde Java y usando el código de salida para determinar si tuvo éxito o no.

¿Es posible hacer que ese comando informe si se modificó algún archivo local? Lo ideal sería informar a través de un código de salida.

Respuesta1

No puede rsyncdecirle eso a través del código de salida. Los códigos de salida tienen significados predefinidos documentados.

Creo que la mejor manera de hacer esto desde Java sería agregar la opción --info=NAMEde mencionar solo los nombres de directorios y archivos actualizados:

rsync -a --info=NAME --update user@remotehost/files/ ~/files/

Esto imprime los nombres de los archivos y directorios actualizados, uno por línea, en la salida estándar (fd = 0).

Luego, recopilaría el resultado rsyncy contaría el número de nuevas líneas en la cadena.

Creo que una buena manera de recopilar el resultado javase puede encontrar en esta respuesta, pero no la he probado:https://stackoverflow.com/a/9048519/5484716

Hacernoutilizar redirectErrorStreamo fusionar de cualquier otra forma la salida estándar y los flujos de error estándar. Si lo hace, contará los mensajes de error como archivos actualizados, no como lo que desea.

Respuesta2

Basado en la idea de @DavidKing de permitir que rsync imprima los nombres de los archivos copiados, y ampliada con información de @yashma de que grep saldrá del estado de salida distinto de cero cuando la entrada estándar esté vacía, podemos crear esta breve y críptica frase satisfactoria:

# prints file list, exits nonzero when that list is empty
rsync -a --info=NAME --update user@remotehost:/files/ ~/files/ | grep .

Respuesta3

La --infobandera activada rsyncmostrará la ruta de cualquier archivo transferido. El código de salida de rsyncindica éxito/fracaso, por lo que no podrá usarlo sin incluir un script alrededor del comando como

#!/bin/bash

files=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)

if [ $files = "" ]; then
  # files weren't transferred
  exit 0
else
  # files were transferred
  exit 1
fi

y luego llamar a ese script desde Java en lugar del rsynccomando directamente. rsyncProbablemente generará algunas otras líneas de texto al principio y al final de la transmisión, por lo que es posible que deba ajustar la ifdeclaración para tener en cuenta las líneas adicionales de salida, pero la idea básica funcionaría.

Respuesta4

La forma de obtener la información mediante el código de retorno sería escribir un script de shell que llame rsyncy ejecute el script de shell desde java. Hay algunos problemas importantes con esto, como se detalla a continuación. El script de shell podría verse así:

#!/bin/sh
if OUTPUT=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)
then
    if [ "$OUTPUT" != "" ]                   # got output?
    then
        exit 0  # yes, success, "some" files were updated
    fi
fi
exit 1  # either rsync failed or no files were updated

El principal problema con esto es que no podrá saber si el proceso de sincronización se completó correctamente. Sólo sabes si los archivos se actualizaron o no. Es por eso que recomendaría recopilar el resultado en Java y contar las líneas.ycomprobar el código de retornoen java.

información relacionada