如何以编程方式检测 rsync 是否检测到更改?

如何以编程方式检测 rsync 是否检测到更改?

如果我做:

echo 'sup' > sup.txt
echo 'nup' > nup.txt
echo 'sup' > sup2.txt
rsync -P --archive --human-readable --itemize-changes --dry-run sup.txt nup.txt
rsync -P --archive --human-readable --itemize-changes --dry-run sup.txt sup2.txt

两个 rsync 调用都返回退出代码 0,这使得很难通过编程检测是否存在更改。

使用 rsync 来检测是否有变化的最佳方法是什么,并在检测到第一个变化时立即退出(比如在比较两个巨大目录的情况下)。

但是我尝试过通过管道传输| grep -qvE '^>',但没有成功,因为两者仍然返回退出代码 0。我现在的想法是,我可以| grep '^>' |先执行管道传输,使其在任何 stdin 上退出 1,如果没有 stdin,则退出 0。

答案1

这是我想出的管道解决方案| grep '^>' | ifne 'false'

因此,完整的代码示例是:

echo 'sup' > sup.txt
echo 'nup' > nup.txt
echo 'sup' > sup2.txt
rsync -P --archive --human-readable --itemize-changes --checksum --dry-run sup.txt nup.txt | grep '^>' | ifne 'false'
echo "sup nup = $?"

rsync -P --archive --human-readable --itemize-changes --checksum --dry-run sup.txt sup2.txt | grep '^>' | ifne 'false'
echo "sup sup2 = $?"

请注意,在这个虚构的例子中,--checksum和的添加可能是相同的日期和大小。nup.txtsup.txt

如果你仍然关心 stdout,那么使用rsync ... | pee cat "grep '^>' | ifne 'false'"

此代码取决于更多工具

相关内容