![在 bash 脚本中使用 wget 中下载文件的数量作为变量](https://linux22.com/image/580054/%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20wget%20%E4%B8%AD%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E7%9A%84%E6%95%B0%E9%87%8F%E4%BD%9C%E4%B8%BA%E5%8F%98%E9%87%8F.png)
我可以获取已下载文件的数量并将wget -r
其用作变量吗?我想编写一个脚本,在其中运行多个 wget 命令(使用 -q 以便我可以控制输出),然后在最后将已下载文件的数量加起来并将其回显给用户。这可能吗?
答案1
为了在 Jed 的建议基础上进一步完善它,你可以这样做:
MY_VARIABLE=$(wget -r http://foo 2>&1 | grep -c 'saved')
或者,如果你想要更复杂一点,但更可靠和稳健一点,你可以提取 wget 给出的摘要下载计数:
MY_VARIABLE=$(wget -r -nv http://foo 2>&1 | awk '/^Downloaded:/ {print $2}')
更新:关于2>&1
构造,对于 *nix 应用程序,有两个默认输出流,stdout
(文件描述符 1)和stderr
(文件描述符 2)。对于交互式命令,两者通常都发送到屏幕/终端,因此很难区分它们。告诉2>&1
您的 bash 获取发送到 (fd 2) 的输出stderr
并将其与 (fd 1) 的输出相结合stdout
。结果是单个输出流,它将查找管道中的下一个工具(如上所示),就像输出在屏幕上显示的那样。
这是必需的,因为 wget 默认将其状态信息发送到stderr
,而不是stdout
。如果您在不重定向的情况下运行上述程序stderr
,则将发送stdout
到管道程序,但仅此而已。您将看到 wget 的所有输出都发送到您的屏幕 ( stderr
),并且变量将为空,因为grep
或awk
语句正在处理stdout
(没有输出)。
要查看应用程序发送到哪里的内容,您可以执行以下操作:
wget -r -nv http://foo 2>foo.err 1>foo.out
要不就:
wget -r -nv http://foo 2>foo.err >foo.out
如果您没有指定输出重定向的数字,则默认为stdout
。
文件foo.err
和将分别包含您的命令以和foo.out
结尾的内容。stderr
stdout
另外值得注意的是,您还可以使用|&
作为管道命令与 结合stderr
,stdout
作为 的简写2>&1
。
stdin
有关命令重定向和、stdout
和的更多信息stderr
,请参阅 bash 手册页、stdin、stdout 和 stderr 手册页,有关和的历史原因stdout
,stderr
请参阅此帖子:http://jstorimer.com/2011/12/29/the-difference-between-stdout-and-stderr.html
答案2
您可以简单地将所有输出定向到一个文件,并使用标志-a
将输出发送到文件,然后 grep 日志文件并计算单词“saved”的出现次数:
root@demo:tmp# wget -r http://www.google.com/index.html -a logfile
root@demo:tmp# grep saved logfile |wc -l
1