Redirecionando sed para enrolar e arquivar

0

Eu preciso baixar algumas páginas de um site.
O que estou tentando fazer é usar sed no código-fonte do site para obter os links, passando-os um por um para curl e, em seguida, exibir o arquivo baixado no arquivo correto no diretório correto. Vou tentar ficar mais explícito.
Na fonte da página, há linhas como esta:

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

Estou obtendo o que preciso (link - filename - dirname) assim:

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> \(.*\)| > /|p' |
        xargs -r 
done;

qual saída é algo assim:

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

O que eu preciso fazer é redirecionar http://www.site.org/the/file-42.php content para um arquivo chamado /the/file-42 em um diretório chamado OutDir
Então, em vez de xargs -r , pensei em usign xargs -r curl para redirecionar curl output para um arquivo.
Mas isso não funciona.

Você tem alguma sugestão de como redirecionar a saída 'curl' para um arquivo dessa maneira?

    
por LotoLo 26.02.2017 / 20:27

3 respostas

1

O motivo pelo qual seu estratagema de usar o < - > xargs < - curl não funciona é que > é interpretado pelo shell e não xargs .

Há algumas coisas que você pode fazer aqui: 1) curl -o , como mostrado abaixo:

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  -o /|p' |
    bash 
done

Se você quiser usar xargs , poderá:

 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> \(.*\)| /|p' |
    xargs -r -n 2 sh -c 'shift $1; curl $1 > $2' 2 1

concluído;

    
por 27.02.2017 / 08:34
1

Você não pode criar o comando completamente ( curl url -o file ) e ecoá-lo através de um pipe como entrada para bash ?

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

OTH

    
por 26.02.2017 / 22:39
0

Usando o GNU Parallel, você pode fazer:

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