将 xargs 与来自文件的输入一起使用

Jos*_*h K 45 scripting bash xargs

假设我有一个包含以下内容的文件

bob
john
sue
Run Code Online (Sandbox Code Playgroud)

现在这些直接对应(在本例中)URL 模式,例如http://example.com/persons/bob.tar, john.tar, sue.tar

我想使用这些线路并运行它们xargs。我不知道传递给正在执行的命令的内容是什么。我如何从提示符(比如我想简单地回显每一行cat file | xargs echo $PARAM)或从 bash 脚本访问参数。

Ste*_*fan 81

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

cat file | xargs -I % curl http://example.com/persons/%.tar
Run Code Online (Sandbox Code Playgroud)

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

但是这里的猫没用

而是使用:

<file xargs -I % curl http://example.com/persons/%.tar
Run Code Online (Sandbox Code Playgroud)

  • @Josh出于某种原因,人们倾向于在这里认真对待猫的不必要使用;我已经两次被否决了 (12认同)
  • 为了记录,你得到了我的 +1。我认为使用`cat` 真的很好,只是想添加更多信息...... :) (2认同)

Mic*_*zek 18

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

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
Run Code Online (Sandbox Code Playgroud)

  • @Josh K:`&gt;` 是一个 shell 结构,不适用于 `xargs`。另一方面,`curl -o` 将写入命名文件而不是 stdout,就像 `wget` 所做的那样,所以这可能是你想在这里使用的。 (2认同)

eph*_*ent 12

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

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


另一方面,如果你只是想把文件中的每一行都变成一个 URL,

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

会做的,如果你想获取所有这些,只需将其通过管道传输到.| wget -i


小智 9

外壳循环的另一种方式:

for i in `cat file`; do curl -I http://foo.com/$i; done
Run Code Online (Sandbox Code Playgroud)

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

  • 你已经[陷入了一个经典的错误](http://partmaps.org/era/unix/award.html#arg-max)!&lt;-- 断开的链接,这是一个缓存版本:[无用使用 Cat 奖](http://archive.is/fBdSf)。 (2认同)

Ole*_*nge 5

使用 GNU Parallel,您可以:

cat urls | parallel curl {} ">" {/}
Run Code Online (Sandbox Code Playgroud)

或者:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar
Run Code Online (Sandbox Code Playgroud)

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