
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 rsync
decirle 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=NAME
de 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 rsync
y contaría el número de nuevas líneas en la cadena.
Creo que una buena manera de recopilar el resultado java
se puede encontrar en esta respuesta, pero no la he probado:https://stackoverflow.com/a/9048519/5484716
Hacernoutilizar redirectErrorStream
o 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 --info
bandera activada rsync
mostrará la ruta de cualquier archivo transferido. El código de salida de rsync
indica é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 rsync
comando directamente. rsync
Probablemente 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 if
declaració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 rsync
y 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.