如何将wget与URL列表及其对应的输出文件一起使用?


35

假设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列表下载并将返回的数据保存到正确的本地文件中?

Answers:


33

缺省情况下,wget写入名称为传递给它的URL的最后一个组成部分的文件。许多服务器将URL重定向http://www.url1.com/app?q=123&gibb=erish&gar=ble到具有类似文件名的其他URL,例如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

err如果所有下载均成功,则该变量包含0,否则包含1,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(而且,我假设这是磁盘上的文件)。


这是一个变体:用一行创建一个小脚本wget -O $2 $1。在list_of_urls文件,使每行的URL,空白,文件名(例如,http://url1/blah&blah=whatever some.pdf然后使用与上述相同的,与替换wget的线。./thatscript.sh $url在这种情况下,$url实际上是与当前的URL和文件名,行。
金发

2
变体2:将url和文件名放在list_of_urls文件的单独的交替行中,然后使用while read url; do read filename; wget -O $filename $url; done < list_of_urls
goldilocks 2013年

2

您可以直接使用wget选项:

wget -r -i list_of_urls

这不起作用:-r启用递归下载。文件名设置不正确。
jofel 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.