wget で検索されたファイル名の前に --content-disposition オプションを使用します。

wget で検索されたファイル名の前に --content-disposition オプションを使用します。

URLパターンを介していくつかのファイルをダウンロードする必要があります。https://www.server.org/data/2021/{i}ここでは1から1000までさまざまです。

ファイルはPDFファイルで、すべて一意の名前を持ちます。例:

https://www.server.org/data/2021/1 ====> document_about_feature.pdf   
https://www.server.org/data/2021/2 ====> "activity report.pdf"    
https://www.server.org/data/2021/3 ====> "2021-financial analysis from bla bla.pdf" 
...    

現在私はこれらのファイルを使用していますwget次のように:

#!/bin/bash

for i in {1..1000}
do
  URL="https://www.server.org/data/2021/${i}"
  wget -nv --content-disposition "${URL}"
done

これがファイルをダウンロードするときに元のファイル名を保持する唯一の方法です(フラグがない場合、--content-dispositionファイル名は1.pdf、2.pdf、3.pdfなどになります)。したがって、うまくいきますが、iファイル名の後にプレフィックス(またはサフィックス)を追加してファイル名間のリンクを維持したいと思います。

https://www.server.org/data/2021/1 ====> 1_document_about_feature.pdf   
https://www.server.org/data/2021/2 ====> "2_activity report.pdf"    
https://www.server.org/data/2021/3 ====> "3_2021-financial analysis from bla bla.pdf"   
...  

これを正しく達成するにはどうすればよいですか(Ubuntu 22.04.3)。

バージョン:GNU Wget(linux-gnuで構築された1.21.2)。

答え1

次のものをダウンロードして名前を変更することもできます。

#!/bin/bash
# use this directory as tempfile prefix
# (so that move becomes a single-filesystem operation)
tmpdirname="$(mktemp -d -p --tmpdir . "fetch_XXXXXXX")"
for i in {1..1000}; do
  URL="https://www.server.org/data/2021/${i}"

  # I'm almost certain you'll want file names 0001,…,0999,1000; not 1…1000
  formatted="$(printf '%04d' i)"

  dirname="${tmpdirname}/${formatted}"
  mkdir "${dirname}"
  pushd "${dirname}"
    wget -nv --content-disposition "${URL}"
    filename=*
  popd
  mv -- "${dirname}/${filename}" "${formatted} ${filename}"
  rmdir "${dirname}"
done
rmdir "${tmpdirname}

個人的には、ページによると、wget周囲にダートバイクがあったことを覚えています。--content-dispositionman

curl私は最近それに傾いているので、次のようwget -nv --content-disposition "${URL}"に置き換えますcurl --remote-name --remote-header-name

#!/bin/bash
# use this directory as tempfile prefix
# (so that move becomes a single-filesystem operation)
tmpdirname="$(mktemp -d -p --tmpdir . "fetch_XXXXXXX")"
for i in {1..1000}; do
  URL="https://www.server.org/data/2021/${i}"

  # I'm almost certain you'll want file names 0001,…,999,1000; not 1…1000
  formatted="$(printf '%04d' i)"

  dirname="${tmpdirname}/${formatted}"
  mkdir "${dirname}"
  pushd "${dirname}"
    curl --remote-name --remote-header-name -- "${URL}"
    filename=*
  popd
  mv -- "${dirname}/${filename}" "${formatted} ${filename}"
  rmdir "${dirname}"
done
rmdir "${tmpdirname}

1よくテストされた非常に近代的なプロトコルサポート、wgetTLSセッションの正しい再利用とは異なり、低いサーバー負荷でより高速な接続が可能であり、--これを有効な主張にする論理エラーはありません。

関連情報