如何使用xargs将多个参数传递至命令的自定义位置?
解决xargs将多参数一次性传递到指定位置的问题
问题原因
使用xargs -I{}时,该选项的设计逻辑是将每个分隔后的输入项单独替换占位符并执行一次命令,而非一次性传递所有参数。比如你执行echo -n 'file1 file2' | xargs -d' ' -I{} diff {}时,xargs会把输入拆分为file1和file2,分别执行diff file1和diff file2,这就导致diff因缺少第二个参数报错。而不使用-I时,xargs默认会将所有参数一次性传给命令,所以diff能正常工作。
解决方案
方案1:利用命令自身的参数顺序调整选项(以cp为例)
GNU/BSD cp 提供了-t选项,可以将目标目录放在前面,xargs传递的源文件会自动跟在后面,直接实现一次性传递:
echo -n 'file1 file2 file3' | xargs -d ' ' cp -t /somedir
这条命令完全等同于cp file1 file2 file3 /somedir。
方案2:通过sh -c包装命令实现一次性参数传递
如果目标命令不支持类似-t的顺序调整选项,可以用sh -c将所有参数一次性传递到指定位置:
echo -n 'file1 file2 file3' | xargs -d ' ' sh -c 'cp "$@" /somedir' _
sh -c 'cp "$@" /somedir'是执行的shell脚本,其中"$@"代表所有传入的参数;- 末尾的
_用来填充shell脚本的$0参数(sh -c的第一个参数是脚本内容,第二个参数会被设为$0,后续才是$1、$2等位置参数); - xargs会将所有拆分后的参数一次性传给
sh -c,最终执行cp file1 file2 file3 /somedir。
内容的提问来源于stack exchange,提问作者David Nguyen
相关产品推荐
相关产品推荐

