Есть ли опция curl/wget, которая запрещает сохранять файлы при ошибках http?
Вопрос
Я хочу загрузить в скрипт много 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