具有多个参数的xargs

我有一个源input, input.txt

a.txt b.txt c.txt 

我想将这些input提供给一个程序,如下所示:

 my-program --file=a.txt --file=b.txt --file=c.txt 

所以我尝试使用xargs ,但没有运气。

 cat input.txt | xargs -i echo "my-program --file"{} 

它给

 my-program --file=a.txt my-program --file=b.txt my-program --file=c.txt 

但我想要

 my-program --file=a.txt --file=b.txt --file=c.txt 

任何想法?

Solutions Collecting From Web of "具有多个参数的xargs"

到目前为止所给出的解决方案都没有正确处理包含空间的文件名。 如果文件名包含“或”,有些甚至会失败。如果你的输入文件是由用户生成的,你应该准备好令人惊讶的文件名。

GNU Parallel很好地处理这些文件名,并为您提供(至少)3种不同的解决方案。 如果你的程序需要3个参数,只有3个参数,那么这将工作:

 (echo a1.txt; echo b1.txt; echo c1.txt; echo a2.txt; echo b2.txt; echo c2.txt;) | parallel -N 3 my-program --file={1} --file={2} --file={3} 

要么:

 (echo a1.txt; echo b1.txt; echo c1.txt; echo a2.txt; echo b2.txt; echo c2.txt;) | parallel -X -N 3 my-program --file={} 

但是,如果你的程序需要尽可能多的参数,

 (echo a1.txt; echo b1.txt; echo c1.txt; echo d1.txt; echo e1.txt; echo f1.txt;) | parallel -X my-program --file={} 

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

不要听所有的人:)只要看看这个例子:

 echo argument1 argument2 argument3 | xargs -l bash -c 'echo this is first:$0 second:$1 third:$2' | xargs 

输出将是

 this is first:argument1 second:argument2 third:argument3 

怎么样:

 echo $'a.txt\nb.txt\nc.txt' | xargs -n 3 sh -c ' echo my-program --file="$1" --file="$2" --file="$3" ' argv0 

您可以使用sed前缀--file=到每一行然后调用xargs

 sed -e 's/^/--file=/' input.txt | xargs my-program 

这是一个使用sed的三个参数的解决方案,但是由于它对每个参数都应用了相同的转换,所以是有限的。

 cat input.txt | sed 's/^/--file=/g' | xargs -n3 my-program 

这里有一个方法可以用于两个参数,但允许更多的灵活性:

 cat input.txt | xargs -n 2 | xargs -I{} sh -c 'V="{}"; my-program -file=${V% *} -file=${V#* }' 

这是因为echo打印换行符。 尝试类似

 echo my-program `xargs --arg-file input.txt -i echo -n " --file "{}` 

我正在为这个确切的问题寻找一个解决方案,并对中间脚本的编码进行了总结。

为下一个示例使用-n'\ n'分隔符来转换标准输出

例:

  user@mybox:~$ echo "file1.txt file2.txt" | xargs -n1 ScriptInTheMiddle.sh inside the ScriptInTheMidle.sh: !#/bin/bash var1=`echo $1 | cut -d ' ' -f1 ` var2=`echo $1 | cut -d ' ' -f2 ` myprogram "--file1="$var1 "--file2="$var2 

对于这个解决方案的工作,你需要在这些参数file1.txt和file2.txt之间有一个空格,或者你选择的任何一个分隔符,还有一件事,在脚本里面确保你检查-f1和-f2,因为它们的意思是“第一个单词并取第二个单词“取决于第一个分隔符的位置(可以是单引号中的任意位置),可以根据需要添加任意多个参数。

用xargs,cut和一些bash脚本解决了问题。

干杯!

如果你想通过我有一些有用的提示http://hongouru.blogspot.com

xargs不能这样工作。 尝试:

   myprogram $(sed -e's / ^ /  -  file = /'input.txt)

没有人提到从一个循环回声,所以我会把它完整的缘故(这将是我的第二个方法,sed是第一个):

 for line in $(< input.txt) ; do echo --file=$line ; done | xargs echo my-program 

我偶然发现了一个类似的问题,并找到了解决办法,我认为这个解决方案比迄今为止的解决方案更好,更清洁。

我已经结束的xargs的语法是(对于你的例子):

 xargs -IX echo --file=X 

完整的命令行是:

 my-program $(cat input.txt | xargs -IX echo --file=X) 

这将工作,如果

 my-program --file=a.txt --file=b.txt --file=c.txt 

已完成(提供input.txt包含您的示例中的数据)。


其实在我的情况下,我需要首先找到文件,也需要他们排序,所以我的命令行如下所示:

 my-program $(find base/path -name "some*pattern" -print0 | sort -z | xargs -0 -IX echo --files=X) 

一些细节可能不清楚(他们不适合我):

  • some*pattern必须被引用,否则在传递之前将会扩展它。
  • -print0 ,然后-z ,最后-0使用空分离来确保正确处理具有空格或其他有线名称的文件。

但是请注意,我还没有深入地测试它。 虽然它似乎在工作。