从curl实时捕获百分比下载

时间:2015-12-20 15:06:00

标签: macos bash shell curl sed

我正在通过int main(int argc,char *argv[]){ int sockfd, linenum; //declare necessary variables char str[100]; char i[100]; char server_respose[2000],line1[1000],line2[1000],line3[1000],line4[1000],line5[1000]; char welcome[100]; struct sockaddr_in servaddr; // socket address struct if(argc != 2) { printf("\n Usage: %s <ip of server> \n",argv[0]); return 1; } sockfd = socket(AF_INET, SOCK_STREAM, 0); //create a socket with the appropriate protocol if (sockfd == -1) { printf("Could not create socket\n"); } puts("Socket created"); servaddr.sin_family = AF_INET; //IPv4 servaddr.sin_port = htons(1999); memset(servaddr.sin_zero, '\0', sizeof servaddr.sin_zero); servaddr.sin_addr.s_addr = inet_addr(argv[1]); if(connect(sockfd,(struct sockaddr *)&servaddr, sizeof(servaddr))<0){ perror("connect failed. Error"); return 1; // attempt to connect to a socket } printf("--You are connected to the server--\n"); recv(sockfd, welcome, 100, 0) ... } 从远程服务器下载文件。该脚本将通过Platypus打包为应用程序,如果脚本输出的格式为curl,则可让应用显示百分比进度,如here所述。我试过这个

PROGRESS:\d+\n

获取输出百分比,它不起作用。我尝试了另一种方法here。这没效果。

如何并行捕获像curl -O <remote_file> | sed -r 's/[# ]//g;s/^/#/g' 这样的下载和回显文本。

P.S也许是因为Bash和GNU Sed不存在,它没有按预期工作。

1 个答案:

答案 0 :(得分:1)

首先,curl输出标准错误输出上的渐进信息,因此您必须至少考虑STDERR,例如使用2>&1将其与STDOUT合并。

其次,curl在下载文件时不生成\n符号,但在下载文件时保持在同一行以覆盖显示的进度。因此,您可能必须通过char输出流来读取char,例如使用IFS= read -r -n1 char

给定一个curl - 像进程字符串流,我建议使用一个保护机制来知道必须保留哪个字符:

  • 如果是数字,我们现在要保留字符。
  • 如果是%符号,我们现在不想再保留字符了

以下代码使用这些想法,可能适合您的问题。

curl -# -O URL 2>&1 | while IFS= read -r -n1 char; do
    [[ $char =~ [0-9] ]] && keep=1 ;
    [[ $char == % ]] && echo "PROGRESS:$progress" && progress="" && keep=0 ;
    [[ $keep == 1 ]] && progress="$progress$char" ;
done

享受!

PS:您当然可以通过连接所有这些代码将其用作oneliner,但我认为这样更容易阅读。