yarkov
@yarkov
Помог ответ? Отметь решением.

Как запустить wget с данными из двух массивов?

Есть файл ./result/ok.txt
1321231321321321321
4564654654564654654
4654654654654654564

Есть файл ./result/urls.txt
http://url.ru/some?v=86ff8d97yguifidgijdhfkjghdflkgjdf
http://url.ru/some?v=879874g65df4g65d4gf65d4f65g4
http://url.ru/some?v=d89f7g98df7g987fd98g7d98f7gfd

Ссылки ведут на картинки. Надо скачать их так:
wget -O ./img/1321231321321321321.jpg http://url.ru/some?v=86ff8d97yguifidgijdhfkjghdflkgjdf
wget -O ./img/4564654654564654654.jpg http://url.ru/some?v=879874g65df4g65d4gf65d4f65g4
wget -O ./img/4654654654654654564.jpg http://url.ru/some?v=d89f7g98df7g987fd98g7d98f7gfd

Вот что я накалякал:
#!/bin/bash

declare -a NAMES
declare -a URLS

# Считываем файлы в массивы
NAMES=`cat ./result/ok.txt`
URLS=`cat ./result/urls.txt`

# Определяем длину массивов
LEN_NAMES=${#NAMES[@]}
LEN_URLS=${#URLS[@]}

# Папка для сохранения
IMG_FOLDER="img"
[ -d ${IMG_FOLDER} ] || mkdir -p ${IMG_FOLDER}

n=1
echo ${NAMES[$n]}
echo ${URLS[$n]}
#wget -b -O "./imgs/"$NAMES[$n]".jpg" $URLS[$n]

#for n in $LEN_NAMES
#do
    #echo -n $fname
    #wget -b -O "./imgs/"${NAMES[$n]}".jpg" ${URLS[$n]}
#done

Но не выводится в консоль вообще ничего (((
  • Вопрос задан
  • 273 просмотра
Решения вопроса 2
@abcd0x00
makeun.sh
#!/bin/bash

read_lines_pair()
{
    echo "$(head -$1 $2 | tail -1) $(head -$1 $3 | tail -1)"
}

convert_line()
{
    sed 's/^/wget /; s%[^ ]*$%-O ./img/&.jpg%'
}

process()
{
    local len=$(wc -l urls.txt | cut -d' ' -f1)
    for i in `seq 1 $len`; do
        read_lines_pair $i urls.txt names.txt | convert_line
    done
}

process


Вывод
[guest@localhost makeun]$ ./makeun.sh 
wget http://url.ru/some?v=86ff8d97yguifidgijdhfkjghdflkgjdf -O ./img/1321231321321321321.jpg
wget http://url.ru/some?v=879874g65df4g65d4gf65d4f65g4 -O ./img/4564654654564654654.jpg
wget http://url.ru/some?v=d89f7g98df7g987fd98g7d98f7gfd -O ./img/4654654654654654564.jpg
[guest@localhost makeun]$


Потом просто этот вывод передаёшь на sh по каналу.
./makeun.sh | sh
Ответ написан
Комментировать
yarkov
@yarkov Автор вопроса
Помог ответ? Отметь решением.
Яростное гугление принесло плоды ))) Вот так надо было:
#!/bin/bash

# Папка для сохранения
IMG_FOLDER="./images/"
# Если отсутствует, то создаем
[ -d ${IMG_FOLDER} ] || mkdir -p ${IMG_FOLDER}

declare -a NAMES
declare -a URLS

# Читаем файлы с именами картинок и ссылками на них
# Если скрипт парсер отработал удачно, 
# то в обоих файлах одинаковое количество строк
NAMES=( `cat "./result/ok.txt" | tr '\n' ' '`)
URLS=( `cat "./result/urls.txt" | tr '\n' ' '`)

nlen=${#NAMES[*]}
ulen=${#URLS[*]}

if [ $nlen -ne $ulen ]
then
    echo "Количество строк в файлах не равно!"
    echo "Придется запускать парсер снова!"
    exit 1
fi

for (( count=1; count<$nlen; count++ ))
do
    wget ${URLS[$count]} -t 3 -nc --progress=bar --random-wait -nv -O "${IMG_FOLDER}${NAMES[$count]}.jpg"
done
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
butteff
@butteff
Раз в тысячу лет заправляю свитер в носки
Вроде как cat считал весь файл в 0 элемент массива, а не построчно.
построчно можно сделать так:
# Считываем файлы в массивы
NAMES=()
while read -r LINE; do
  NAMES+=("$LINE")
done < 'ok.txt'

URLS=()
while read -r LINE; do
  URLS+=("$LINE")
done < 'urls.txt'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы