假设list_of_urls
看起来像这样:
http://www.url1.com/some.txt
http://www.url2.com/video.mp4
我知道如何使用它:
wget -i list_of_urls
但是,如果我list_of_urls
有这个,并且它们都返回正确的文件(例如 PDF 或视频)怎么办:
http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit
对于单个文件我可以这样做:
wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"
如何wget
下载该 URL 列表并将返回的数据保存到正确的本地文件?
答案1
默认情况下,wget 写入一个文件,该文件的名称是您传递给它的 URL 的最后一个组成部分。许多服务器将 URL 重定向http://www.url1.com/app?q=123&gibb=erish&gar=ble
到具有漂亮文件名(如http://download.url1.com/files/something.pdf
.您可以告诉 wget 使用重定向 URL 中的名称(即something.pdf
),而不是app?q=123&gibb=erish&gar=ble
通过传递--trust-server-names
选项。这不是默认模式,因为如果不小心使用,可能会导致覆盖当前目录中不可预测的文件名;但如果您信任服务器或在不包含其他珍贵文件的目录中工作,--trust-server-names
通常是正确的选择。
某些服务器使用Content-Disposition
标头而不是重定向来指定文件名。传递--content-disposition
选项以使 wget 使用此文件名。
因此:
wget --content-disposition --trust-server-names -i list_of_urls
如果您仍然没有获得漂亮的文件名,您可能需要指定自己的文件名。假设您有一个包含以下行的文件
http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt
要使 wget 将文件下载到指定的文件名,假设 URL 或文件名中没有空格字符:
err=0
while read -r url filename tail; do
wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names
如果所有下载都成功,则该变量包含 0,否则包含 1,如果您将此片段放入函数中或将此片段放入字符串中,则err
可以。return $err
exit $err
如果您不想指定 URL 以外的任何内容,并且无法从服务器获取好听的名称,则可以猜测文件类型并尝试获取至少有意义的扩展名。
err=0
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
ext=data
case $(file -i tmpfile) in
application/pdf) ext=pdf;;
image/jpeg) ext=jpg;;
text/html) ext=html;;
text/*) ext=txt;;
esac
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
根据需要添加其他类型。如果您的file
命令没有该-m
选项,请将其保留,然后检查file
系统上返回的内容以查找您感兴趣的文件类型。如果您的/etc/mime.types
系统上有文件,则可以从以下位置读取 MIME 类型与扩展名的关联:它而不是提供您自己的列表:
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
mime_type=$(file -m tmpfile)
ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
答案2
您可以循环遍历list_of_urls
.像这样的东西:
while read -r url; do
wget -O foo $url
done < list_of_urls
请注意,您必须添加自己的方法来确定foo
每个条目list_of_urls
(另外,我假设这是您磁盘上的文件)。
答案3
您可以直接使用wget
选项:
wget -r -i list_of_urls