首页 > 解决方案 > grep 包含来自 rsync 输出的错误结果

问题描述

我有一个脚本可以使用rsync. 因为我不想要完整的输出细节,所以我grep只选择我想查看的摘要输出:

rsync -PaSh --stats --delete -e 'ssh -p XXXX -i key' /source/ user@X.X.X.X:/destination/ 2>> output.txt |grep -e 'Number of regular files' -e 'Total transferred' -e 'bytes/sec'>> output.txt


这会返回一个很好的摘要,例如:

Number of regular files transferred: 73
Total transferred file size: 165.68M bytes
sent 3.79M bytes  received 207.71K bytes  103.89K bytes/sec


备份位置之一是 Firefox 配置文件,其中文件在浏览时经常更改。
这意味着rsync当不再找到文件时抛出错误:file has vanished.

我想排除这个错误,但由于某种原因,即使它不包含在错误消息中,它也会一直显示grep

file has vanished: "file1"
file has vanished: "file2"
file has vanished: "file3"
rsync warning: some files vanished before they could be transferred (code 24) at main.c(1207) [sender=3.1.3]
Number of regular files transferred: 73
Total transferred file size: 165.68M bytes
sent 3.79M bytes  received 207.71K bytes  103.89K bytes/sec


有人可以帮忙吗?

谢谢

标签: bashgreprsync

解决方案


管道|将标准输出重定向stdout到其他进程的标准输入stdin

然而,与标准输出并行的还有标准错误stderr流。stdout在文件描述符 1 上,stderr在文件描述符 2 上。

要将文件描述符 2 重定向到文件描述符 1,请执行以下操作:

 rsync .... 2>&1 | grep ...

更多信息可以在网上的各个地方找到,可能这方面的文档在posix shell 重定向中:

[...] 这些数字被称为“文件描述符”。值 0、1 和 2 具有特殊含义和常规用途,并且由某些重定向操作隐含;它们分别称为标准输入、标准输出和标准错误。程序通常从标准输入中获取输入,并将输出写入标准输出。错误消息通常写在标准错误上。[...]


推荐阅读