Есть ли опция curl / wget, которая запрещает сохранять файлы при ошибках http? - PullRequest
19 голосов
/ 18 сентября 2008

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

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

Ответы [ 6 ]

17 голосов
/ 18 сентября 2008

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

-f, --fail

(HTTP) Сбой в автоматическом режиме (без вывода) при ошибках сервера. Это в основном сделано для лучшего включить сценарии и т.д., чтобы лучше справляться с неудачными попытками. В обычных случаях, когда HTTP сервер не может доставить документ, он возвращает HTML-документ с указанием так (что часто также описывает почему и многое другое). Этот флаг предотвратит вывод curl этого и ошибка возврата 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 (указывается заголовком Location: и кодом ответа 3XX), эта опция сделать curl повторить запрос на новом месте. [...]

13 голосов
/ 24 февраля 2010

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

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

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

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

3 голосов
/ 30 марта 2015

Древняя нить .. приземлилась здесь в поисках решения ... в итоге написала какой-то шелл-код для этого.

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 секунд для генерации ... а я не хотите, чтобы файл назначения оставался пустым в течение этого времени.

0 голосов
/ 02 марта 2019

ПРИМЕЧАНИЕ: Мне известно, что это более старый вопрос, но я считаю, что нашел решение для тех, кто использует wget, лучше, чем любой из приведенных выше ответов.

wget -q $URL 2>/dev/null

Сохранит целевой файл в локальном каталоге, если и только если код состояния HTTP находится в диапазоне 200 (ОК).

Кроме того, если вы хотите сделать что-то вроде распечатки ошибки всякий раз, когда запрос был встречен с ошибкой, вы можете проверить код завершения wget для ненулевых значений, например:

wget -q $URL 2>/dev/null
if [ $? != 0]; then
    echo "There was an error!"
fi

Надеюсь, это поможет кому-то, кто столкнулся с теми же проблемами, что и я.

Обновление: Я просто поместил это в более удобную для сценариев форму для своего собственного проекта и решил поделиться:

function dl {
    pushd . > /dev/null
    cd $(dirname $1)
    wget -q $BASE_URL/$1 2> /dev/null
    if [ $? != 0 ]; then
        echo ">> ERROR could not download file \"$1\"" 1>&2
        exit 1
    fi
    popd > /dev/null
}
0 голосов
/ 11 апреля 2016

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

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

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

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

0 голосов
/ 22 ноября 2011

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

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

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

...