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


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"

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

回答:


33

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

一部のサーバーでは、Content-Dispositionリダイレクトの代わりにヘッダーを使用してファイル名を指定します。--content-dispositionwgetにこのファイル名を使用させるオプションを渡します。

したがって:

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すべてのダウンロードが成功した場合、1がそうでない場合、あなたができる変数は0が含まれてい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.typesMIMEタイプと拡張子の関連付けを読み取ることができます。独自のリストを提供する代わりに:

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です。1行で小さなスクリプトを作成します。list_of_urlsファイルで、各行をURL、空白、ファイル名にします(たとえばhttp://url1/blah&blah=whatever some.pdf、上記と同じものを使用し、wget行を./thatscript.sh $url。に置き換えます。この場合$url、実際には、当然URLとファイル名の行です。)
goldilocks

2
バリエーション2:urlとファイル名をlist_of_urlsファイルの別々の行に入れてから、を使用しますwhile read url; do read filename; wget -O $filename $url; done < list_of_urls
goldilocks

2

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

wget -r -i list_of_urls

これは機能しません:-r再帰的なダウンロードを有効にします。ファイル名が正しく設定されていません。
ジョフェル14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.