首页 > 解决方案 > 如何在 Golang 中连续解析 rsync 进度?

问题描述

exec.Command("rsync", "-ah --info=progress2 src dst") 执行,这rsync将连续产生以下结果:

3.76G 100%  515.60MB/s    0:00:06 (xfr#1, to-chk=0/1)

那么,如何连续解析 rsync 进度呢?谢谢!

下面是我的代码:

func CopyWithProgress(src, dst string) {
    cmd := exec.Command("rsync", fmt.Sprintf("-a --info=progress2 %s %s", src, dst))

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err = cmd.Start(); err != nil {
        log.Fatal(err)
    }

    go func(scanner *bufio.Reader) {
        percentMatcher := progress.NewMatcher(`(\d+\%)`)
        etaMatcher := progress.NewMatcher(`(\d+\:\d+\:\d+)`)
        speedMatcher := progress.NewMatcher(`(\d+\.\d+.{2}\/s)`)
    
        for scanner.Scan() {
            logStr := scanner.Text()
            fmt.Printf("Progress=%v\n", logStr)
        }
    }(bufio.NewScanner(stdout))

    if err = cmd.Wait(); err != nil {
        log.Fatal(err)
    }
}

但我无法scanner扫描 rsync 的输出。

标签: gorsync

解决方案


要获取命令的流输出:检查Cmd.StdoutPipe(),以及文档中的示例代码。

要逐行读取文本输出:您可以使用 a bufio.Scanner(再次检查示例)。


推荐阅读