【shell】xargs及常见用法

时间:2022-08-02 09:20:03
【背景】
xargs全称是transform arguments,意为转换参数,它将标准输入转换为命令行参数。因为linux命令行中经常要使用到管道符连接不同的命令,但是有些命令不支持标准输入,此时就需要使用xargs将标准输入转换为参数。

【命令格式】
stdin_input | xargs [option] cmd

可见,xargs一般是通过管道符接受标准输入并将其转换为命令行参数传递给cmd。


【常见用法】
1.将标准输入转换成命令行参数
echo arg1 arg2 arg3 | xargs echo
arg1 arg2 arg3
上述例子将前一个echo输出的字符串转换为命令行参数传递给第二个echo。

2.控制每行的参数数量
echo arg1 arg2 arg3 | xargs -n 2 echo
arg1 arg2
arg3
上述例子基本等同于第一个例子,但不同的是使用了-n选项加一个数字限定了每次最多传递给echo变量的命令行参数。

3.指定定界符

echo arg1:arg2:arg3 | xargs -d ':' echo
arg1 arg2 arg3

xargs将空格作为默认的定界符,但可以用-d选项指定定界符。


4.参数替换
假设命令cmd需要固定使用-a和-b选项,其中只是-a选项需要替换参数,此时可以使用xargs的-I选项指定替换字符串。
echo arg1 arg2 arg3 | xargs -I {} cmd -a {} -b
上述命令会将args1、args2、args3逐个替换到第二个花括号内。此外,对于每个命令行参数,cmd命令都会被执行一遍。

5.-0选项
find ./ -iname *.txt -print0 | xargs -0 rm -f
-0选项使xargs将'\0'字符作为标准输入的定界符。这在结合find进行文件操作时很有用,因为文件名中可能含有空格符,所以将空格符作为定界符是危险的,可能造成误删。上述例子在find命令中使用了-print0选项将输出的文件名之间用'\0'分隔开,再使用-0选项让xargs用'\0'作为定界符,这样就可以避免文件名含有空格造成的误删。