web-dev-qa-db-ja.com

URLとそれに対応する出力ファイルのリストでwgetを使用するにはどうすればよいですか?

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のリストをダウンロードし、返されたデータを適切なローカルファイルに保存するにはどうすればよいですか?

36
Kit

デフォルトでは、wgetは、渡されたURLの最後のコンポーネントを名前とするファイルに書き込みます。多くのサーバーはhttp://www.url1.com/app?q=123&gibb=erish&gar=bleのようなURLをhttp://download.url1.com/files/something.pdfのような見栄えの良いファイル名で別のURLにリダイレクトします。 something.pdfオプションを渡すことにより、app?q=123&gibb=erish&gar=bleの代わりにリダイレクトされたURL(つまり--trust-server-names)の名前を使用するようにwgetに指示できます。不注意に使用すると、現在のディレクトリにある予測できないファイル名が上書きされる可能性があるため、これはデフォルトのモードではありません。しかし、サーバーを信頼するか、他の貴重なファイルを含まないディレクトリで作業している場合は、通常、--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

URLまたはファイル名に空白文字がないと仮定して、wgetでファイルを指定したファイル名にダウンロードするには、次のようにします。

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

list_of_urlsのエントリをループすることができます。このようなもの:

while read -r url; do
    wget -O foo $url
done < list_of_urls

list_of_urlsの各エントリに対してfooを決定する独自の方法を追加する必要があることに注意してください(また、これはディスク上のファイルであると想定しています)。

3
rahmu

wgetオプションを直接使用できます:

wget -r -i list_of_urls
2
Steph