如何检查rsync是否对bash进行了任何更改?


12

我有一个脚本,该脚本使用rsync在远程->本地方案中同步数据。运行rsync命令后,立即检查错误代码是否等于零。如果其为零,则执行其他命令。但是,这没有考虑到rsync可能已经成功运行但实际上并未进行任何更改的事实。因此,无论如何都将等于零条件运行,这有点多余。

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

将其扩展为检查是否确实存在基于运行的rsync命令的任何更改的最佳方法是什么。我已经读过-i标志可以将输出提供给stdout,但是如何将其放在条件块中呢?


您已经到-v那里了,因此它已经在提供您需要输出的信息...例如,实际发送的文件列表。如果什么都没改变,那就是./
goldilocks 2015年

啊! 如果我取出-v并改用-i然后在rsync命令上使用非空字符串检查怎么办?
詹姆斯·怀特

看起来您自己找到了解决方案?:-)
Bjorn Munch

2
您可以使用a=$("rsync command")。这将执行rsync命令并存储stdout在中a。然后,您可以在a
nitishch

1
您也可以添加a | grep /或类似的内容,然后使用来检查grep的退出状态,$?如果没有输出,则应该为1。
比约恩·蒙克

Answers:


9

根据对我的原始问题的评论,使用-i标志将rsync输出输出到stdout,并使用非字符串检查条件来查看错误代码检查中是否有任何实际更改。将rsync命令包装在变量中可以完成检查。

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

潜在的缺点是,您必须丢失详细的输出,但始终可以将其记录到文件中。


1

我想要一个更严格的解决方案。我不想grep Number of created files:(消息可能是另一种语言)或删除所有行,但-v输出中只有两行(谁知道rsync在下一版本中将打印什么摘要?)。

我发现您可以设置rsync日志的格式,但不能设置其stdout的格式(请参阅参考资料man rsyncd.conf)。

例如,添加“文件已更改!” 到具有实际更改文件的每一行,然后grep为其:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.