重複の作成を停止できますか?


13

wgetを2回実行すると、そのファイルが既にダウンロードされていることが認識されず、新しいファイルが作成されます。ファイルを再度ダウンロードしないようにする方法はありますか?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(wgetでこれができない場合は、curlまたは同様のスクリプト可能な代替手段を使用してください。)


9
ファイルが存在することを認識しているので、それは新しいものを作成します!
ニコ

回答:


17

この-Nオプションを使用することをお勧めします。

-N
--timestamping
    Turn on time-stamping.

タイムスタンプが有効になり、ファイルがダウンロードされたバージョンよりもサーバー上で新しい場合にのみ、ファイルが再ダウンロードされます。

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

警告(KasiyAのコメントより)

サーバーが適切に構成されていない場合、ファイルが新しいことを常に報告し、常にファイル-Nを再ダウンロードします。この場合、-ncおそらくより良いオプションです。


3
サーバーが適切に構成されていない場合、-N失敗することがあり、wgetは常に再ダウンロードします。だから、時には-ncよりも優れている-N
αғsнιη

1
@Kasiy、コメントありがとうございます。すべての場合に適した選択肢はないようです。
ジョフェル

16

はい、それは-cオプションです。

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

ファイルが同じ場合、2回目のダウンロード試行は停止します。

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

警告(jofelのコメントから)

サーバー上でファイルが変更されている場合、この-cオプションは誤った結果をもたらす可能性があります。

を使用すると-c、wgetはサーバーに、ダウンロード済みのファイルの部分以外のデータを要求するだけで、それ以外は何も行いません。すでにダウンロードされているファイルの一部に変更があったかどうかはチェックしません。したがって、古いファイルと新しいファイルが混在した破損したファイルになる可能性があります。


ローカルテスト

次のようにシンプルなローカルWebサーバーを実行することでテストできます(@roadmr回答に感謝):

ターミナルウィンドウを開き、次を入力します。

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

別のターミナルを開いて、次の操作を行います。

wget -c http://localhost:8000/filename-to-download

注記filename-to-downloadに位置するファイルである/path/to/parent-download-dir/、我々はそれをダウンロードしたいです。

wgetコマンドを複数回実行すると、次のように表示されます。

The file is already fully retrieved; nothing to do.

さて、/path/to/parent-download-dir/ディレクトリに移動してソースファイルに何かを追加します。たとえば、テキストファイルの場合は、簡単な行を追加してファイルを保存します。で試してみてくださいwget -c ...。これで、ファイルの再ダウンロードが再び表示されるようになりましたが、既にダウンロード済みです。

理由:なぜ再ダウンロードするのですか?

そのサイズは、ダウンロードした古いファイルよりも大きなサイズに変更されたため、他には何もありませんでした。


1
ダウンロードの間にサーバーでファイルが変更された場合、これは正しく機能しません。最悪の場合(ファイルサイズが増加した場合)、破損したファイルを取得します。
ジョフェル

1
@jofel yes -ncはあなたが言ったようには機能しませんが、-cオプションは機能するので、-c最初にオプションについて説明しました。
αғsнιη

を使用すると、既にダウンロードされたファイルの部分以外のデータをサーバー-cwget要求し、それ以外は何も要求しません。サーバー上のファイルの既にダウンロードされた部分に変更があるかどうかはチェックしません。最悪の場合、古いファイルと新しいファイルが混在した破損したファイルを取得します。
ジョフェル

私は、これは、ログファイル(保証増分更新)のようなもののためにのみ有用だと思うのオプションを検討した後、他のすべての場合では、私は、-Nまたは-ncは、より多くの彼らは全体のファイルを扱うように適切であると考える
david.libremone

3

また-nc、wgettingのために呼び出される別のオプションがあります。

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

ときに-ncオプションを指定すると、Wgetは同じファイルのコピーをダウンロードすることを拒否します。wgetダウンロードしようとする同じファイルがある場合、ローカルファイルの名前を変更するか削除しない限り、ダウンロードを拒否します。

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

このオプションは非常に優れている場合があり、同じ名前の場合、ローカルファイルでダウンロードファイルを上書きするため-nc、両方-cまたはオプションの代わりにオプションを使用することをお勧めします。-N

警告(ジョフェルのコメントより)

-ncサーバーで変更された場合、このオプションはファイルを更新しません。ファイルが変更されることがわかっている-N場合は、このオプションをお勧めします。ファイルが変更されないことがわかっている(または気にしない)場合-ncは問題ありません。


1

これはwgetに関する特定の質問であることは知っていますが、OPは「wgetがこれを実行できない場合、curlまたは同様のスクリプト可能な代替手段を使用してください」と述べていました。ここでの要件が何なのかわかりません(複数のファイル、オリジナルと異なる場合は古いバージョンを保持し、新しくダウンロードしたバージョンに置き換えます)。必要なものと重複の処理方法に応じて、これ以上のものが必要になる場合があります。

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

このコマンドは、毎回古いファイルを新しくダウンロードしたファイルに置き換えます。

テキストではなくバイナリファイルをダウンロードする場合は、これを端末に出力しないでください( "> [filename]"なし)。これを行うと、ターミナルセッションが混乱する可能性があります。偶然にこれを行う場合、別のシェル/ターミナルセッションを開く必要があります。


バイナリファイルを表示したために端末の形状が悪い場合は、新しい端末を開くよりも「リセット」プログラムを呼び出す方が簡単かもしれません。
ジョフェル

私は私の要件にクリアされなかったことを、あなたしている権利は、幸せな結果は、私はいくつかのより多くのオプション:)感謝を学んだということです
david.libremone

@jofelに感謝します^^「リセット」を知らなかった私はいつも新しいタブを開いて、これが起こったときに文字化けしたタブを閉じただけでした。
ゴブリンロード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.