URLリストとその出力ファイルでwgetを使用する方法は?

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

ベストアンサー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-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

すべてのダウンロードが成功すると、この変数には0が含まれ、それ以外の場合は1が含まれます。このスニペットを関数に入れるか、このスニペットを文字列に入れるのは大丈夫ですerrreturn $errexit $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

おすすめ記事