it-swarm.cn

将xargs与文件输入一起使用

说我有一个以下文件

bob
john
sue

现在,它们直接对应于(在这种情况下)URL模式,例如http://example.com/persons/bob.tar,_john.tarsue.tar

我想采用这些行并通过xargs运行它们。我不知道是什么传递给正在执行的命令。如何从Prompt(例如,我想简单地回显cat file | xargs echo $PARAM之类的每一行)或bash脚本中访问参数。

44
Josh K

迈克尔的 answer 是正确的,应该可以解决您的问题。跑步

cat file | xargs -I % curl http://example.com/persons/%.tar

将下载文件bob.tarjohn.tar.sue.tar符合预期。

[〜#〜]但是[〜#〜]这里的猫没用了

宁可使用:

<file xargs -I % curl http://example.com/persons/%.tar
74
Stefan

我想您是在问如何在命令中间插入从xargs'stdin拉出的各个行,而不是总是将其粘贴到最后。如果是这样,则-I标志取replacement-string参数; xargs将替换replacement-string在命令中,从stdin中读取以下行:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
-文件
阅读项目从文件而不是标准输入。如果使用此
选项,则在运行命令时stdin保持不变。否则-
明智的做法是,从/ dev/null重定向stdin。
 ... 

您可能需要设置--delimiter=/-d'\n'


另一方面,如果您只是想将文件中的每一行都转换为网址,

 $  sed  -e's#。*#http://example.com/persons/&.tar#'文件

可以,如果您想获取所有这些,只需将其通过管道传递到| wget -i

9
ephemient

shell循环的另一种方式:

for i in `cat file`; do curl -I http://foo.com/$i; done

您还可以通过在最后一个分号之前附加&在后台运行每个迭代-对于非常大的下载,这可能很方便

8
Brad Clawsie

使用GNU并行,您可以执行以下操作:

cat urls | parallel curl {} ">" {/}

要么:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar

观看介绍视频GNU并行了解更多信息: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done循环很简单,但用途广泛:

while read Word; do wget http://example.com/persons/$Word; done < file
1
musiphil

这是Stefan:s答案的更一般的版本,但是我在中间使用awk来准备要xargs执行的确切“字符串”。然后xargs使用bash进行实际的“工作”。

对于这个示例来说有点过头了,但是这是一个通用的解决方案,只需进行一些修改就可以解决许多问题...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
0
Johan