HTTPサーバーからファイルをダウンロードする必要がありますが、それは前回ダウンロードしたときから変更された場合のみです(If-Modified-Since
ヘッダー経由など)。また、ディスク上のファイルにカスタム名を使用する必要があります。
Linuxでこのタスクに使用できるツールは何ですか?
wget -N
で使用できないため、使用-N
できません-O
。
HTTPサーバーからファイルをダウンロードする必要がありますが、それは前回ダウンロードしたときから変更された場合のみです(If-Modified-Since
ヘッダー経由など)。また、ディスク上のファイルにカスタム名を使用する必要があります。
Linuxでこのタスクに使用できるツールは何ですか?
wget -N
で使用できないため、使用-N
できません-O
。
回答:
のcurl
代わりに使用することを検討してくださいwget
:
curl -o "$file" -z "$file" "$uri"
man curl
言う:
-z
/--time-cond
<日付式>(HTTP / FTP)指定された日時より後に変更されたファイル、またはその時刻より前に変更されたファイルを要求します。日付式には、あらゆる種類の日付文字列を使用できます。内部式と一致しない場合は、代わりに特定のファイル名から時刻を取得しようとします。
$file
必ずしも事前に存在しない場合は、次を使用して-z
条件付きフラグを使用する必要がありますtest -e "$file"
。
if test -e "$file"
then zflag="-z '$file'"
else zflag=
fi
curl -o "$file" $zflag "$uri"
(ここでは$zflag
、0または2個のトークンに分割するため、ここでの展開は引用していません)。
シェルが配列(例:Bash)をサポートしている場合、より安全でクリーンなバージョンがあります。
if test -e "$file"
then zflag=(-z "$file")
else zflag=()
fi
curl -o "$file" "${zflag[@]}" "$uri"
wgetスイッチ-N
はファイルが変更された場合にのみファイル-N
を取得するため、必要な場合はファイルを取得するが間違った名前のままにしておく単純なスイッチを使用する方法が考えられます。次に、ln -P
コマンドを使用して正しい名前の「ファイル」にリンクするハードリンクを作成します。リンクされたファイルには、元のファイルと同じメタデータがあります。
唯一の制限は、ファイルシステムの境界を越えてハードリンクを作成できないことです。
curlコマンドをラップするためのPython 3.5以降のスクリプト:
import argparse
import pathlib
from subprocess import run
from itertools import chain
parser = argparse.ArgumentParser()
parser.add_argument('url')
parser.add_argument('filename', type=pathlib.Path)
args = parser.parse_args()
run(chain(
('curl', '-s', args.url),
('-o', str(args.filename)),
('-z', str(args.filename)) if args.filename.exists() else (),
))
chain
:)
「日付チェック」(「curl --time-cond」を使用)と同様の方法は、ファイルサイズの比較に従ってダウンロードすることです。つまり、ローカルファイルのサイズがリモートファイルと異なる場合のみダウンロードします。
たとえば、ダウンロードプロセスが途中で失敗したため、ローカルにダウンロードされたファイルはリモートファイルよりも新しい日付になりますが、実際には破損しているため、再ダウンロードが必要です。
local_file_size=$([[ -f ${FILE_NAME} ]] && wc -c < ${FILE_NAME} || echo "0")
remote_file_size=$(curl -sI ${FILE_URL} | awk '/Content-Length/ { print $2 }' | tr -d '\r' )
if [[ "$local_file_size" -ne "$remote_file_size" ]]; then
curl -o ${FILE_NAME} ${FILE_URL}
fi
「別の回答で提案された」「curl -z / --time-cond」オプションは、この場合リモートファイルをダウンロードしません(ローカルファイルの日付が新しいため)が、この「サイズチェック」スクリプトは!