web-dev-qa-db-ja.com

カールでダウンロードするときに既存のファイルをスキップする方法は?

リンクをダウンロードするためにcurlをしたいのですが、既存のファイルをスキップしたいです。今のところ、私が持っているコード行はそれを上書きし続けます:

curl '$url' -o /home/$outputfile &>/dev/null &

どうすればこれを達成できますか?

24
thevoipman

curlブロック内にifへの呼び出しを置くだけです。

if ! [ -f /home/$outputfile ]; then
  curl -o /home/$outputfile "url"
fi

また、この例では$url単一引用符の内側では、意図したとおりに機能しません。比較:

echo '$HOME'

に:

echo "$HOME"

また、curlには--silentスクリプトで役立つオプション。

23

Curlオプション-C -を使用できます。このオプションは、壊れたダウンロードを再開するために使用されますが、ファイルがすでに完了している場合はダウンロードをスキップします。 -Cの引数は単一のダッシュであることに注意してください。欠点は、curlがリモートサーバーに一時的に接続してファイルサイズを要求することです。

14
Wolfgang

代わりに--no-clobberでwgetを使用します。

-nc--no-clobber:既存のファイルにダウンロードするダウンロードをスキップします。

例:

wget -nc -q -O "/home/$outputfile" "$url" 
12
evil otto

curlは、-Oおよび-Jと一緒に使用するとファイルのスキップをサポートする場合がありますが、動作に一貫性がありません。

-J--remote-header-name)は基本的に-O--remote-name)オプションに、URLからファイル名を抽出する代わりにサーバー指定のContent-Dispositionファイル名を使用するように指示します。このようにして、curlはサーバーが返すファイル名を実際には認識しないため、安全のために既存のファイルを無視する場合があります。

出典: Re:-J "上書きを拒否しています..."

例えば:

$ curl -LJO -H 'Accept: application/octet-stream' 'https://api.github.com/repos/x/y/releases/assets/12345
Warning: Refusing to overwrite my_file.bin: File 
Warning: exists
curl: (23) Failed writing body (0 != 16384)

ただし、すでに述べたように、その動作は予測不可能であり、すべてのファイルに対して機能するわけではありません。

1
kenorb