如果我做:
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.txt
sup.txt
如果你仍然关心 stdout,那么使用rsync ... | pee cat "grep '^>' | ifne 'false'"
此代码取决于更多工具。