ダウンロードした直後にwget -i
によってダウンロードされた複数のファイルを処理できるようにしたい(内のすべてのファイルを待つのではなく)終了するリスト-wget
プロセス全体を終了します)。問題は次のとおりです。wget
はファイルを所定の場所にダウンロードするため、ファイルを安全に処理できる(完全にダウンロードされている)時期がわかりません。理想的には、原則的なアプローチは、(私が信じる)wget
で最初にファイルを一時ディレクトリにダウンロードし、完了したらmv
で実際の宛先ディレクトリにダウンロードすることです。 mv
はアトミック*であるため、宛先ディレクトリに存在するすべてのファイルが完全にダウンロードされ、処理の準備ができていることを保証できます。
マンページを確認しましたが、この目的のために何も見つからないようです。私の現在のハッキーなアプローチは、fuser
を使用して、wget
でファイルが開かれていないかどうかを確認することです。しかし、これは非常に壊れやすく(wget
がファイルを複数回開くとどうなりますか?)、それを避けたいと思います。
これを正確に達成する方法がない場合、同じ効果を達成できる回避策はありますか?関係がある場合、ファイルはHTMLページです。
*補遺:どうやら mv
はアトミックではないかもしれません (私の環境ではそうですが)厳密なアトミック性は必要ないと思いますが。唯一の要件は、ファイルの名前が宛先ディレクトリに変更されると、完全にダウンロードされることです(そして、完全なコンテンツは新しいパスですぐに利用できます)。
編集:プロセスを複数のwget
コマンドに分割することも、wget
のいくつかのコア機能(レート制限、HTTPキープアライブ、DNSキャッシングなど)の使用を妨げるため、理想的ではありません。
使用する aria2c
代わりに:
aria2c --on-download-complete="/path/to/script" -i file
したがって、スクリプトは次のようになります。
#!/bin/bash
notify-send "Finished: $3"
$1
はaria2cからのgidです。$2
はファイルの数です。$3
はファイル名です。