cat e Pipe to Run Command não aceitam dois argumentos

3

Eu tenho usado este comando:

cat urls.txt | xargs -n 1 -P 10 wget -q

para baixar arquivos de texto de URLs. Isso funcionou bem quando meu arquivo de URL era como:

http://domain1.com/page.html
http://domain2.com/page.html
http://domain3.com/page.html

No entanto, agora preciso fazer o download de arquivos de texto de URLs e postar dados, como:

--post-data '1=1' http://domain1.com/page.html
--post-data '1=1' http://domain2.com/page.html
--post-data '1=1' http://domain3.com/page.html

Ao usar o comando cat acima, ele tenta baixar o URL e depois os dados do post como um URL. por exemplo. no exemplo acima, ele faria o download do link e depois tentaria fazer o download de --post-data 1 = 1, então link e assim por diante.

Existe alguma maneira de fazer com que o gato envie cada linha apenas dos arquivos de URLs?

Atualizar : descobri que adicionando uma fuga ao espaço como:

--post-data '1=1'\ http://domain1.com/page.html

está fazendo com que seja tratado como um URL, mas o - parece ser retirado do argumento --post-data.

    
por Kohjah Breese 23.01.2014 / 00:55

3 respostas

3

Para fazer com que xargs execute seu comando uma vez para cada linha de entrada, forneça a opção -L 1 (e remova a opção -n 1 , pois elas são mutuamente exclusivas). O documento padrão para xargs diz o seguinte:

-L number
The utility shall be executed for each non-empty number lines of arguments
from standard input. A line is considered to end with the first <newline>
unless the last character of the line is a <blank>; a trailing <blank>
signals continuation to the next non-empty line, inclusive.
    
por Mark Plotnick 23.01.2014 / 01:23
1

Abra o terminal e execute:

cat urls.txt | sed "s/[\"\<\>' \t\(\);]/\n/g" | grep "http://" | sort -u | xargs -n 1 -P 10 wget -q
    
por karel 23.01.2014 / 01:27
0

Não é necessário xargs , você pode fazer isso com um simples loop bash Mantenha seus URLs como uma lista simples e adicione as opções diretamente a wget :

while IFS= read -r url; do wget --post-data '1=1' "$url"; done < urls.txt

ou inclua-os no arquivo e passe-os para wget :

while IFS= read -r url; do wget "$url"; done < urls.txt
    
por terdon 25.01.2014 / 21:13