Unix 标准中的wget或curl

Unix 标准中的wget或curl,unix,curl,wget,stdin,xargs,Unix,Curl,Wget,Stdin,Xargs,我想下载一个网页,同时从stdin提供URL。实际上,一个进程不断地生成指向stdout/file的URL,我想通过管道将它们传递到wget或curl。(如果你愿意,可以把它想象成一个简单的网络爬虫) 这似乎很管用: tail 1.log | wget -i - -O - -q 但是当我使用“tail-f”时,它不再工作了(缓冲或wget正在等待EOF?): 有人能提供使用wget、curl或任何其他标准Unix工具的解决方案吗?理想情况下,我不想在循环中重新启动wget,只要让它在下载UR

我想下载一个网页,同时从stdin提供URL。实际上,一个进程不断地生成指向stdout/file的URL,我想通过管道将它们传递到wget或curl。(如果你愿意,可以把它想象成一个简单的网络爬虫)

这似乎很管用:

tail 1.log | wget -i - -O - -q 
但是当我使用“tail-f”时,它不再工作了(缓冲或wget正在等待EOF?):


有人能提供使用wget、curl或任何其他标准Unix工具的解决方案吗?理想情况下,我不想在循环中重新启动wget,只要让它在下载URL时继续运行即可。

使用
xargs
将stdin转换为参数

tail 1.log | xargs -L 1 wget

您需要使用的是xargs。例如

tail -f 1.log | xargs -n1 wget -O - -q

尝试将
tail-f
通过
python-c$”导入pycurl;c=pycurl.Curl()\n为True时:c.setopt(pycurl.URL,原始输入().strip()),c.perform()'


这就得到了curl(您可能指的是命令行curl,我把它称为Python一行程序中的库,但它仍然是curl)来立即获取每个URL,同时如果您从同一个服务器依次请求多个URL,仍然可以利用保持服务器套接字打开的优势。但它并不完全健壮:如果您的一个URL是duff,整个命令将失败(您可能希望将其作为一个适当的Python脚本,并添加
try
/
来处理此问题,除了
),还有一个小细节,它将在EOF上抛出
EOFError
(但我假设如果您使用的是
tail-f
),这并不重要。

如果在同一个web服务器上下载文件,有效的方法是避免使用xargs

wget -q -N -i - << EOF
http://sitename/dir1/file1
http://sitename/dir2/file2
http://sitename/dir3/file3
EOF

wget-q-N-i-With
xargs
wget
接收URL作为参数,这样您就不再需要
-i-
tail-f 1.log | xargs-n1 wget-O--q>这将根据URL启动新的wget进程。如果这是在共享机器上运行的,您可能想知道任何其他用户都可以使用“ps”命令,因此不要在URL中放置密码等。如果这可能是一个问题,请使用不涉及将stdin转换为参数的解决方案之一(具有机器root访问权限的管理员当然仍然可以检查您正在获取的URL,但您可能更信任管理员而不是其他随机用户)。正如我对另一个答案的评论:如果这是在共享计算机上运行的,您可能想知道任何其他用户都可以使用“ps”命令读取您的参数,因此不要在URL中输入密码等。如果可能出现问题,请使用不涉及将stdin转换为参数的解决方案之一(拥有机器root访问权限的管理员当然仍然可以检查您正在获取的URL,但您可能更信任管理员而不是其他用户)。
wget -q -N -i - << EOF
http://sitename/dir1/file1
http://sitename/dir2/file2
http://sitename/dir3/file3
EOF