リンクをダウンロードするためにcurl
をしたいのですが、既存のファイルをスキップしたいです。今のところ、私が持っているコード行はそれを上書きし続けます:
curl '$url' -o /home/$outputfile &>/dev/null &
どうすればこれを達成できますか?
curl
ブロック内にif
への呼び出しを置くだけです。
if ! [ -f /home/$outputfile ]; then
curl -o /home/$outputfile "url"
fi
また、この例では$url
単一引用符の内側では、意図したとおりに機能しません。比較:
echo '$HOME'
に:
echo "$HOME"
また、curl
には--silent
スクリプトで役立つオプション。
Curlオプション-C -
を使用できます。このオプションは、壊れたダウンロードを再開するために使用されますが、ファイルがすでに完了している場合はダウンロードをスキップします。 -C
の引数は単一のダッシュであることに注意してください。欠点は、curlがリモートサーバーに一時的に接続してファイルサイズを要求することです。
代わりに--no-clobber
でwgetを使用します。
-nc
、--no-clobber
:既存のファイルにダウンロードするダウンロードをスキップします。
例:
wget -nc -q -O "/home/$outputfile" "$url"
curl
は、-O
および-J
と一緒に使用するとファイルのスキップをサポートする場合がありますが、動作に一貫性がありません。
-J
(--remote-header-name
)は基本的に-O
(--remote-name
)オプションに、URLからファイル名を抽出する代わりにサーバー指定のContent-Disposition
ファイル名を使用するように指示します。このようにして、curl
はサーバーが返すファイル名を実際には認識しないため、安全のために既存のファイルを無視する場合があります。
例えば:
$ 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)
ただし、すでに述べたように、その動作は予測不可能であり、すべてのファイルに対して機能するわけではありません。