我的shell脚本将文件上传到服务器。我喜欢stdout和stderr写入文件和控制台。但我不希望stderr的进度条/百分比转到文件。我只想要卷曲错误写入文件。
最初我有这个
curl ... 2>> "$log"
这为下载到日志文件编写了1行或更多行,但没有任何内容可供控制。
然后我将其改为curl ... 3>&1 1>&2 2>&3 | tee -a "$log"
这写到了控制台和文件,是的!除了它将每个百分比的整个进度写入文件,使得日志文件非常庞大且阅读繁琐。
如何在控制台中查看进度,但只将输出的最后一部分写入文件?
我想要这个
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
106 1166 0 0 106 1166 0 2514 --:--:-- --:--:-- --:--:-- 2 106 1166 0 0 106 1166 0 795 0:00 :01 0:00:01 --:--:-- 0 106 1166 0 0 106 1166 0 660 0:00:01 0:00:01 --:--:-- 0
这是第二次卷曲重定向
的结果 % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 9.8G 0 0 0 16384 0 24764 4d 22h --:--:-- 4d 22h 24764
0 9.8G 0 0 0 3616k 0 4098k 0:41:54 --:--:-- 0:41:54 15.9M
0 9.8G 0 0 0 24.2M 0 12.9M 0:12:59 0:00:01 0:12:58 19.8M
0 9.8G 0 0 0 50.4M 0 17.5M 0:09:34 0:00:02 0:09:32 22.7M
0 9.8G 0 0 0 79.8M 0 20.5M 0:08:09 0:00:03 0:08:06 24.7M
1 9.8G 0 0 1 101M 0 20.7M 0:08:04 0:00:04 0:08:00 24.0M
1 9.8G 0 0 1 129M 0 21.9M 0:07:37 0:00:05 0:07:32 25.1M
1 9.8G 0 0 1 150M 0 21.8M 0:07:41 0:00:06 0:07:35 25.1M
1 9.8G 0 0 1 169M 0 21.5M 0:07:47 0:00:07 0:07:40 23.8M
1 9.8G 0 0 1 195M 0 21.9M 0:07:38 0:00:08 0:07:30 23.0M
2 9.8G 0 0 2 219M 0 22.1M 0:07:33 0:00:09 0:07:24 23.5M
2 9.8G 0 0 2 243M 0 22.4M 0:07:29 0:00:10 0:07:19 22.9M
2 9.8G 0 0 2 273M 0 22.9M 0:07:17 0:00:11 0:07:06 24.6M
..
.. hundreds of lines...
..
99 9.8G 0 0 99 9982M 0 24.8M 0:06:45 0:06:41 0:00:04 24.5M
99 9.8G 0 0 99 9.7G 0 24.8M 0:06:44 0:06:42 0:00:02 24.9M
99 9.8G 0 0 99 9.8G 0 24.8M 0:06:44 0:06:43 0:00:01 26.0M
100 9.8G 0 0 100 9.8G 0 24.8M 0:06:44 0:06:44 --:--:-- 25.8M
编辑: 根据{{3}}
,我不明白2>filename
# Redirect stderr to file "filename."
但如果我使用它,我就不会在文件中获得每个stderr进度线。如果我尝试任何其他解决方案,则每个stderr进度行都会重定向到文件
答案 0 :(得分:1)
正如视频是一系列帧一样,控制台中的更新百分比是一系列线条。文件中的内容是真正的输出。区别在于文本文件中的回车符,下面是以下文本,而在控制台中则覆盖当前行。
如果您想在控制台中看到更新百分比,而不是文件,则可以使用以下内容:
curl |& tee >(sed '1b;$!d' > log)
或者:
curl |& tee /dev/tty | sed '1b;$!d' > log
答案 1 :(得分:0)
我们假设您有10个巨大的.txt文件test1.txt ... test10.txt
以下是如何使用单个cURL命令上传它们并记录结果而不记录进度表,诀窍是使用--write-out
或-w
选项,来自{ {3}},这些都是上传到FTP的相关字段:
curl -T "test[1-10:1].txt" -u user:password sftp://example.com:22/home/user/ -# -k -w "%{url_effective}\t%{ftp_entry_path}\t%{http_code}\t%{http_connect}\t%{local_ip}\t%{local_port}\t%{num_connects}\t%{num_redirects}\t%{redirect_url}\t%{remote_ip}\t%{remote_port}\t%{size_download}\t%{size_header}\t%{size_request}\t%{size_upload}\t%{speed_download}\t%{speed_upload}\t%{ssl_verify_result}\t%{time_appconnect}\t%{time_connect}\t%{time_namelookup}\t%{time_pretransfer}\t%{time_redirect}\t%{time_starttransfer}\t%{time_total}\n" >> log.txt
对于您的log.txt
文件,您可能需要先预先列出列标题:
echo -e "url_effective\tftp_entry_path\thttp_code\thttp_connect\tlocal_ip\tlocal_port\tnum_connects\tnum_redirects\tredirect_url\tremote_ip\tremote_port\tsize_download\tsize_header\tsize_request\tsize_upload\tspeed_download\tspeed_upload\tssl_verify_result\ttime_appconnect\ttime_connect\ttime_namelookup\ttime_pretransfer\ttime_redirect\ttime_starttransfer\ttime_total" > log.txt
-#
使进度条有点整洁,如:
######################################################################## 100.0%
######################################################################## 100.0%
... curl -T "test[1-10:1].txt"
部分允许您指定要上传的文件范围。