2014-07-26 2 views
1

Я пытаюсь написать сценарий оболочки, который загружает файлы с помощью cURL и обнаруживает, приводит ли URL-адрес к ошибке 404. Если URL-адрес равен 404, я хочу сохранить ссылку url или имя файла в текстовый файл.многократная загрузка cURL с обнаружением 404

Формат URL является http://server.com/somefile[00-31].txt

Я возиться с тем, что я нашел на Google и в настоящее время имеют следующий код:

#!/bin/bash 

if curl --fail -O "http://server.com/somefile[00-31].mp4" 
then 
    echo "$var" >> "files.txt"  
else 
    echo "Saved!" 
fi 

ответ

3
#!/bin/bash 

URLFORMAT="http://server.com/somefile%02d.txt" 

for num in {0..31}; do 
    # build url and try to download 
    url=$(printf "$URLFORMAT" $num) 
    CURL=$(curl --fail -O "$url" 2>&1) 

    # check if error and 404, and save in file 
    if [ $? -ne 0 ]; then 
     echo $CURL | grep --quiet 'The requested URL returned error: 404' 
     [ $? -eq 0 ] && echo "$url" >> "files.txt" 
    fi 

done 

Вот версия, которая использует аргументы для URL-адресов:

#!/bin/sh 

for url in "[email protected]"; do 
    CURL=$(curl --fail -O "$url" 2>&1) 
    # check if error and 404, and save in file 
    if [ $? -ne 0 ]; then 
     echo $CURL | grep --quiet 'The requested URL returned error: 404' 
     [ $? -eq 0 ] && echo "$url" >> "files.txt" 
    fi 
done 

Вы можете использовать это как: sh download-script.sh http://server.com/files {00..21} .png http://server.com/otherfiles {00..12} .gif

Расширение диапазона будет работать на раковинах bash.

+0

Благодарим вас за ответ. но основная причина, по которой я хочу иметь этот скрипт, - это запустить команду типа 'sh downloadscript.sh http://server.com/files[00-21].png http://server.com/otherfiles[00 -12] .gif' – natehome

+0

@natehome добавил второй скрипт, который будет использовать аргументы для обработки URL. – denisvm

+0

, так что это работает! ... но скрипт не делает URL с двумя цифрами (извините, что действительно неловко сформулировано). Мне нужно, чтобы URL-адреса были ... pic00.png, ... pic01.png. также для URL-адресов, которые не являются 404, он не показывает процесс загрузки. извините за все вопросы noobish и прочее. ive только реально работал с bash и sh в первый раз сегодня – natehome

0

Вы можете использовать опцию -D, --dump-header <file> для захвата всех заголовков, включая Content-Type и HTTP Status Code. Обратите внимание, что заголовки могут быть завершены с помощью новой строки DOS (CR LF), поэтому вам может понадобиться снять символ CR.

curl -s -D headers.txt -o out.dat "http://server.com/somefile[00-31].mp4" 
httpStatus=$(head -1 headers.txt | awk '{print $2}') 
contentType=$(grep "Content-Type:" headers.txt | tr -d '\r') 
contentType=${contentType#*: } 
if [ "$httpStatus" != "200" ]; then 
    echo "FAILED - HTTP STATUS $httpStatus" 
else 
    echo "SAVED" 
fi 
Смежные вопросы