Comment puis-je vérifier si rsync a apporté des modifications dans bash?

12

J'ai un script qui utilise rsync pour synchroniser les données dans un scénario distant -> local. Immédiatement après l'exécution de la commande rsync, vérifiez si le code d'erreur est égal à zéro ou non. Si son zéro, d'autres commandes sont exécutées. Cependant, cela ne prend pas en compte le fait que rsync a pu s'exécuter correctement mais n'a en fait apporté aucune modification. De ce fait, la condition zéro égal fonctionnera indépendamment, ce qui est un peu redondant.

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

Quelle serait la meilleure approche pour développer cela afin de vérifier s'il y avait réellement des changements basés sur la commande rsync qui a été exécutée. J'ai lu que l'indicateur -i peut fournir une sortie à stdout, mais comment cela peut-il être placé dans un bloc conditionnel?

James White
la source
Vous y êtes -v, donc il fournit déjà les informations dont vous avez besoin pour sortir ... par exemple, une liste des fichiers qui ont été réellement envoyés. Si rien n'est changé, c'est juste ./.
goldilocks
Ah! Que se passe-t-il si je supprime -v et utilise -i à la place, puis utilise une vérification de chaîne non vide sur la commande rsync?
James White
On dirait que vous avez trouvé la solution vous-même? :-)
Bjorn Munch
2
vous pouvez utiliser a=$("rsync command"). Ceci exécuter la rsynccommande et le magasin stdouten a. Ensuite, vous pouvez exécuter des tests sura
nitishch
1
Vous pouvez également ajouter un | grep /ou quelque chose comme ça, puis vérifier l'état de sortie de grep avec $?, il devrait être 1 s'il n'y a pas de sortie.
Bjorn Munch

Réponses:

9

Sur la base des commentaires de ma question d'origine, effectuez une sortie rsync vers stdout avec l'indicateur -i et utilisez une condition de vérification non chaîne pour voir si quelque chose a réellement changé dans la vérification du code d'erreur. Envelopper la commande rsync dans une variable permet d'effectuer la vérification.

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

Inconvénient potentiel, vous devez perdre la sortie détaillée, mais vous pouvez toujours la consigner dans un fichier à la place.

James White
la source
1

Je voulais une solution plus stricte. Je ne veux pas solliciter Number of created files:(le message pourrait être dans une autre langue) ou supprimer toutes les lignes sauf deux en -vsortie (qui sait quel résumé rsyncsera imprimé dans la prochaine version?).

J'ai trouvé que vous pouvez définir le format du rsyncjournal d'un, mais pas le format de sa sortie standard (voir man rsyncd.conf).

Par exemple, ajoutez un "Fichier modifié!" à chaque ligne avec un fichier réellement modifié, puis greppour cela:

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
Victor Sergienko
la source