将xargs与文件输入配合使用


41

说我有一个以下文件

bob
john
sue

现在,这些直接corrospond到(在这种情况下)URL模式如http://example.com/persons/bob.tarjohn.tarsue.tar

我想采取这些路线,并贯穿它们xargs。我不知道是什么传递给正在执行的命令。如何从提示符(例如,我想简单地回显每行cat file | xargs echo $PARAM)或bash脚本中访问参数。


抱歉,我不太关注这个问题。特别是,我不确定“虽然我不知道传递给正在执行的命令的内容是什么”的意思
迈克尔·穆罗泽克

1
@Michael:当您运行列表时xargs,将其按行拆分,然后将每行输入到命令中,对吗?如果我需要说些类似的话,该如何访问cat file | xargs curl http://example.com/[PASSED FROM FILE].tar
乔什(Josh K)2010年

Answers:


69

迈克尔的答案是正确的,应该理清您的问题。跑步

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

将按bob.tar john.tar. sue.tar预期下载文件。

但是这里的猫没用

宁可使用:

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

1
在我的一个文件示例中,它可能并不理想,cat xaa xab xac xad ... xargs ...
Josh K 2010年

10
@Josh由于某种原因,人们倾向于在这里真的很认真地对待猫。我为此两次被
投票

2
根据记录,您从我这里得到+1。我认为使用cat真的很好,就像添加更多信息一样... :)
Stefan

当然应该是xargs -I % curl …xargs选项curl及其选项/参数之前)。至少xargs curl -I %xargs-I %的选项,而不是curl)是不可移植的。
克里斯·约翰森

@Chris,不错,tnx。固定。
Stefan 2010年

16

我想您是在问如何xargs在命令中间插入从'stdin 提取的单行,而不是总是将其粘贴到最后。如果是这样,该-I标志接受一个replacement-string参数;xargs然后将replacement-string命令替换为从stdin中读取的行:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar

好吧,怎么样curl http://example.com/foobar.tar > foobar.tar
乔什(Josh K)2010年

2
@Josh K:>是一个shell构造函数,不适用于xargs。另一方面,curl -o将像wget执行此操作一样写入命名文件而不是stdout ,因此可能是您要在此处使用的内容。
短暂

9
$ man xargs
...
       --arg-file =文件
       -一份文件
              从文件而不是标准输入中读取项目。如果你用这个
              选项,运行命令时标准输入保持不变。其他-
              明智的是,stdin从/ dev / null重定向。
...

您可能还希望将--delimiter=/ -d设置'\n'为。


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

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

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


8

Shell循环的另一种方式:

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

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


2
爱上了经典的错误之一!<-链接断开,这是一个缓存版本:猫奖的无用使用
Sorpigal

@Sorpigal该网址已损坏。什么是“经典失误”?
starbeamrainbowlabs 2015年

@starbeamrainbowlabs-猫的无用使用,我在上面的评论中放置了该链接的缓存版本。
slm

@starbeamrainbowlabs:我专门链接到Dangerous Backticks,但是如果您更改为一会儿使用,也不需要使用cat:while IFS= read i ; do curl ... ; done < file
Sorpigal


1

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

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

0

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

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

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.