Есть ли параметр curl/wget, который говорит, что не сохранять файлы при ошибках HTTP?

Я хочу загрузить много URL-адресов в script, но я не хочу сохранять те, которые приводят к ошибкам HTTP.

Насколько я могу судить по страницам man, ни curl, ни wget не предоставляют такую ​​функциональность. Кто-нибудь знает о другом загрузчике, который делает?

Ответы

Ответ 1

Один вкладыш, который я только установил для этой цели:

(работает только с одним файлом, может быть полезным для других)

A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Removing temp file")

Это попытается загрузить файл с удаленного хоста. Если есть Ошибка, файл не сохраняется. Во всех остальных случаях он сохранялся и переименовывался.

Ответ 2

Я думаю, что опция -f для curl делает то, что вы хотите:

-f, --fail

(HTTP) Неисправность (без вывода на выходе) при ошибках сервера. В основном это делается для улучшения           включить скрипты и т.д., чтобы лучше справляться с неудачными попытками. В обычных случаях, когда HTTP           сервер не может предоставить документ, он возвращает HTML-документ, указывающий так (что часто           также описывает, почему и многое другое). Этот флаг предотвратит вывод завитка из этого и           обратная ошибка 22. [...]

Однако, если ответ был фактически перенаправлением 301 или 302, который все равно сохраняется, даже если его назначение приведет к ошибке:

$ curl -fO http://google.com/aoeu
$ cat aoeu
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/aoeu">here</A>.
</BODY></HTML>

Чтобы выполнить перенаправление на его тупик, также дайте опцию -L:

-L, --location

(HTTP/HTTPS) Если сервер сообщает, что запрошенная страница переместилась на другую               (указано с заголовком Location: и кодом ответа 3XX), этот параметр будет               сделайте завиток повторить запрос на новом месте. [...]

Ответ 3

Древняя нить.. приземлился здесь, ища решение... в итоге написал код оболочки, чтобы сделать это.

if [ `curl -s -w "%{http_code}" --compress -o /tmp/something \
      http://example.com/my/url/` = "200" ]; then 
  echo "yay"; cp /tmp/something /path/to/destination/filename
fi

Это будет загружать выходные данные в файл tmp и создавать/перезаписывать выходной файл только в том случае, если статус был 200. Мой пользовательский учет немного отличается... в моем случае вывод занимает > 10 секунд для генерации... и я не сделал хотите, чтобы файл назначения оставался пустым для этой продолжительности.

Ответ 4

У меня есть обходное решение для предложения, оно загружает файл, но оно также удаляет его, если его размер равен 0 (что происходит, если происходит 404).

wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
    rm <filename>;
fi;

Он работает для zsh, но вы можете адаптировать его для других оболочек.

Но это только сохраняет его на первом месте, если вы предоставляете опцию -O

Ответ 5

Вы можете загрузить файл без сохранения с помощью опции "-O -" в качестве

wget -O - http://jagor.srce.hr/

Вы можете получить более подробную информацию в http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage