如何使xargs附加-n的尾随参数?

时间:2017-11-30 14:00:39

标签: xargs

xargs擅长插入初始参数:

    btn_click()
 {
  console.log("execute");
  login.isvaliduser(id,pwd);-----------------------1
  var rid = login.get("roleId").getItem(0);---------------------2
        console.log("role:"+rid);
   }

生成此输出:

seq 0 10 | xargs -n 3 echo foo

当我还想要尾随参数时呢? 那就是什么命令:

foo 0 1 2
foo 3 4 5
foo 6 7 8
foo 9 10

将产生以下所需的输出:

seq 0 10 | xargs -n 3 <WHAT GOES HERE?>

我尝试了以下内容:

foo 0 1 2 bar
foo 3 4 5 bar
foo 6 7 8 bar
foo 9 10 bar

这几乎是正确的,除了它显然每个命令行强制1个项目,这不是我想要的:

seq 0 10 | xargs -n 3 -I {} echo foo {} bar

2 个答案:

答案 0 :(得分:3)

从@ netniV的回答开始计算出这个问题之后, 我现在看到man page实际上包含一个例子 显示如何做到这一点:

xargs sh -c 'emacs "$@" < /dev/tty' emacs
     

启动所需的最小数量的Emacs副本,一个在此之后   另外,编辑xargs标准输入上列出的文件。这个例子   实现与BSD的-o选项相同的效果,但是以更灵活和便携的方式。

wikipedia page显示了一种类似的技巧,并在最后解释了虚拟arg:

  

实现类似效果的另一种方法是使用shell作为已启动的命令,并处理该shell中的复杂性,   例如:

$ mkdir ~/backups
$ find /path -type f -name '*~' -print0 | xargs -0 bash -c 'for filename; do cp -a "$filename" ~/backups; done' bash
     

该行末尾的单词bashbash -c解释为特殊参数$0。如果没有bash这个词的名字,那就是   第一个匹配的文件将分配给$0,文件不会   被复制到~/backups。可以使用任何单词代替bash,但是   因为$0通常会扩展为shell或shell脚本的名称   被执行,bash是一个不错的选择。

所以,这是如何做到的:

seq 0 10 | xargs -n 3 sh -c 'echo foo "$@" bar' some_dummy_string

输出符合要求:

foo 0 1 2 bar
foo 3 4 5 bar
foo 6 7 8 bar
foo 9 10 bar

答案 1 :(得分:2)

使用xargs的-i参数,例如:

ls -1 | xargs -t -i echo "Found {} file"

请注意,-t仅用于显示将要发出的命令。在运行时,请不要使用-t参数。

{}被实际参数替换。请注意,这意味着每个命令每个文件只运行一次。不是一组文件。如果需要使用不同的替换字符串,请在-i

之后指定
ls -1 | xargs -t -i[] xargs echo "Found []{} file"

{}保留在[]

的出现后现在替换的文件名之后

实现所需的输出

创建一个名为runme.sh

的脚本文件
#!/bin/sh
echo "foo $@ bar"

确保chmod + X然后使用

seq 0 10 | xargs -n 3 ./runme.sh

这会产生

foo tests tree.php user_admin.php bar
foo user_domains.php user_group_admin.php utilities.php bar
foo vdef.php bar