GNU/Linux >> Linux の 問題 >  >> Linux

前回の更新以降に変更された場合にのみ、http 経由でファイルをダウンロードします

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 (),
))

Linux
  1. Stderrのみをリダイレクトする方法は?

  2. 文字列の最後の3文字だけを印刷するコマンド?

  3. 特定の文字列(ドメイン)のみを検索別のファイルを抽出しますか?

  1. Aria2c 並列ダウンロード パラメータ

  2. Linux でファイルの最終更新日を取得する

  3. ファイルが変更された場合のリアルタイムバックアップ?

  1. wget を使用してプロキシ経由でファイルをダウンロードする方法

  2. ファイルが存在しない場合にのみファイルを作成する方法は?

  3. 巨大なログ ファイル (>14 GB) で最後の x GB のみを grep しますか?