Faça com que o rsync relate se algum arquivo local foi atualizado

Faça com que o rsync relate se algum arquivo local foi atualizado

Estou executando o rsync para puxar de um host remoto para o host local.

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

Estou executando esse comando em java e usando o código de saída para descobrir se foi bem-sucedido ou não.

É possível fazer com que esse comando relate se algum arquivo local foi modificado? Reportar por meio de um código de saída seria o ideal.

Responder1

Você não pode rsyncdizer isso por meio do código de saída. Os códigos de saída documentaram significados predefinidos.

Acho que a melhor maneira de fazer isso em Java seria adicionar a opção --info=NAMEde mencionar apenas diretórios e nomes de arquivos atualizados:

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

Isso imprime os nomes dos arquivos e diretórios atualizados, um por linha, na saída padrão (fd = 0).

Em seguida, você coletaria a saída rsynce contaria o número de novas linhas na string.

Acho que uma boa maneira de coletar a saída javapode ser encontrada nesta resposta, mas ainda não tentei:https://stackoverflow.com/a/9048519/5484716

Fazernãousar redirectErrorStreamou de qualquer outra forma mesclar a saída padrão e os fluxos de erro padrão. Se fizer isso, você contará as mensagens de erro como arquivos atualizados, e não como deseja.

Responder2

Com base na ideia de @DavidKing de permitir que o rsync imprima nomes de arquivos copiados e expandido com informações de @yashma de que grep sairá do status de saída diferente de zero quando stdin estiver vazio, podemos criar esta linha satisfatoriamente curta e enigmática:

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

Responder3

O --infosinalizador ativado rsyncexibirá o caminho de qualquer arquivo transferido. O código de saída de rsyncindica sucesso/falha para que você não possa usá-lo sem envolver um script em torno do 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

e então chamar esse script de java em vez do rsynccomando diretamente. rsyncprovavelmente produzirá algumas outras linhas de texto no início e no final da transmissão, então você pode precisar ajustar a ifinstrução para dar conta das linhas extras de saída, mas a ideia básica funcionaria.

Responder4

A maneira de obter as informações por código de retorno seria escrever um script de shell que chama rsynce executa o script de shell de java. Existem alguns problemas importantes com isso, conforme descrevo abaixo. O script de shell poderia ser assim:

#!/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

O principal problema com isso é que você não será capaz de saber se o processo de sincronização foi concluído com sucesso. Você só sabe se os arquivos foram atualizados ou não. É por isso que recomendo coletar a saída em java e contar as linhaseverifique o código de retornoem java.

informação relacionada