web-dev-qa-db-fra.com

cat and Pipe to Run Command ne prend pas deux arguments

J'utilise cette commande:

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

pour télécharger des fichiers texte d'URL. Cela a bien fonctionné lorsque mon fichier URL était comme:

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

Cependant, je dois maintenant télécharger des fichiers texte d'URL et publier des données, comme:

--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

Lorsque vous utilisez la commande cat ci-dessus, il essaie de télécharger l'URL, puis les données de publication sous forme d'URL. par exemple. dans l'exemple ci-dessus, il téléchargerait http://domain1.com/page.html puis essaierait de télécharger --post-data 1 = 1, puis http: // domain2 .com/page.html et ainsi de suite.

Existe-t-il de toute façon que chat envoie chaque ligne des fichiers URL uniquement?

Mise à jour : J'ai trouvé cela en ajoutant un échappement à l'espace comme:

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

le fait être traité comme une seule URL, mais le - semble être supprimé de l'argument --post-data.

3
Kohjah Breese

Pour que xargs exécute votre commande une fois pour chaque ligne d'entrée, donnez-lui la -L 1 option (et supprimez le -n 1, car ils s'excluent mutuellement). Le document de normes pour xargs dit ceci:

-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.
3
Mark Plotnick

Ouvrez le terminal et exécutez:

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

Vous n'avez pas besoinxargs, vous pouvez le faire avec une simple boucle bash Soit garder vos URL comme une simple liste et ajouter les options directement à wget:

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

ou incluez-les dans le fichier et passez-les à wget:

while IFS= read -r url; do wget "$url"; done < urls.txt
0
terdon