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

StackOverflow https://stackoverflow.com/questions/89989

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

я думаю -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), если сервер сообщает, что запрашиваемая страница перенесена в другое место (указано с местоположением:Заголовок и код ответа 3xx), эта опция сделает Curl Redo запрос на новом месте.[...]

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

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 (что происходит, если возникает ошибка 404).

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

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

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

ПРИМЕЧАНИЕ: Я знаю, что это старый вопрос, но я считаю, что нашел лучшее решение для тех, кто использует 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
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top