xargs -I 行为

xargs -I 行为

一个变量var包含多个参数,每个参数由新行分隔。

echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three

但是,当省略-I%字符时,我得到以下结果:

echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three

我曾经读到过 {} 会替代当前参数(就像 find 一样),但事实并非如此。我做错了什么?

答案1

的通常行为xargs是将尽可能多的参数粘贴到它运行的任何命令的命令行上,并不断重复,直到完成所有参数。当以这种方式使用时,它可以解决命令行长度限制的问题。

但是当您指定该-I选项时,它会对每个参数运行该命令单独地,一次一个。我不认为这在 Linuxxargs -I选项的文档中完全显而易见,但这就是他们的意思。

-I replace-str
       Replace occurrences of replace-str in the initial-arguments with
       names read from standard input.  Also, unquoted  blanks  do  not
       terminate  input  items;  instead  the  separator is the newline
       character.  Implies -x and -L 1.

答案2

如果您使用 GNU Parallel 而不是 xargs,您可以控制您想要的行为:

# 1 line at a time
echo "$var" | parallel echo ABC {}
# Many lines at a time (divided by # cpu)
echo "$var" | parallel -X echo ABC {} 
# Many lines at a time (not divided)
echo "$var" | parallel -Xj1 echo ABC {} 

安装 GNU Parallel 只需 10 秒钟:

wget pi.dk/3 -qO - | sh -x

观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

相关内容