Перенаправление sed на curl, затем в файл

Мне нужно загрузить несколько страниц с сайта.
Я пытаюсь использовать sed в исходном коде сайта, чтобы получить ссылки, передавая их одну за другой в curl , а затем вывести загруженный файл в правом файле справа каталог.
Я постараюсь уточнить.
В исходном коде страницы есть строки, подобные этой:

... href="view-source: http://www.site.org/the/file-42.php">
/the/file-42.php </a>"&gt; </span><span> OutDir and some more things ...

Я получаю то, что мне нужно (ссылка - имя файла - имя каталога), например:

for i in `cat ~/site_source_file.htm `; do
    echo $i | grep http://www.site.org |
    sed -n 's|^.*\(http://\(www.site.org/the/file-[0-9]*\)\.php\).*.php </a>"&gt; </span><span> \(.*\)|\1 > \3/\2|p' |
        xargs -r 
done;

а результат примерно такой:

http://www.site.org/the/file-42.php > OutDir/the/file-42

Мне нужно перенаправить http://www.site.org/the/file-42.php содержимое в файл с именем / the / file-42 в каталоге с именем OutDir
Итак, вместо одного xargs -r я решил использовать xargs -r curl для перенаправления вывода curl в файл.
Но не работает.

Есть ли у вас предложения, как я могу перенаправить вывод curl в файл таким образом?

0
26.02.2017, 21:31
3 ответа

Причина, по которой ваша уловка с использованием sed <-> xargs <-> curl не работает, заключается в том, что > интерпретируется оболочка , а не xargs .

Здесь вы можете сделать несколько вещей: 1) curl -o , как показано ниже:

for i in `cat ~/site_source_file.htm `; do
    echo $i | grep http://www.site.org |
    sed -n 's|^.*\(http://\(www.site.org/the/file-[0-9]*\)\.php\).*.php </a>"&gt; </span><span> \(.*\)|curl \1 -o \3/\2|p' |
    bash 
done

Если вы хотите использовать xargs , вы можете:

 for i in `cat ~/site_source_file.htm `; do
    echo $i | grep http://www.site.org |
    sed -n 's|^.*\(http://\(www.site.org/the/file-[0-9]*\)\.php\).*.php </a>"&gt; </span><span> \(.*\)|\1 \3/\2|p' |
    xargs -r -n 2 sh -c 'shift $1; curl $1 > $2' 2 1

выполнено;

1
28.01.2020, 02:34

Не можете ли вы полностью создать команду ( curl url -o file ) и передать ее через конвейер в качестве входных данных для bash ?

echo 'curl http://www.di.uminho.pt -o foo' | bash

OTH

{{ 1}}
1
28.01.2020, 02:34

Используя GNU Parallel, вы можете сделать:

lynx -dump ~/site_source_file.htm |
  perl -ne '/^References/ .. 0 and /^\s+\d+..(view-source: )?(.*)/s and print $2;' |
  parallel -j50 wget
0
28.01.2020, 02:34

Теги

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