<返回更多

Linux中的xargs命令

2019-08-12    
加入收藏

在说xargs命令之前,先说两句linux中的管道(pipe)。

管道负责单向连接前一个程序的标准输出与后一个程序的标准输入,其本质是一个共享文件。我们日常最常用到的管道是匿名管道,Shell中的管道符号为“|”。

浅谈Linux中的xargs命令

 

有空会读读与管道有关的内核源码的,比如pipe()

管道用法举例:

ll -Sh /usr/lib | less -N
last | cut -d ' ' -f 1 | sort | uniq -c
kill -15 `ps aux | grep redis-cli | grep -v grep | awk '{print $2}'`

那么xargs命令又和管道有什么关系呢?如果把上面的第三个例子换一种写法:

浅谈Linux中的xargs命令

 

这说明kill命令没有接收到应有的参数。还有很多命令(比如最常见的mkdir、rm、cp等等等)都不会从标准输入读取内容,这时如果在管道符后加上xargs,再加上要执行的命令,那么前一个程序的标准输出就会作为后一个程序的参数,而不是标准输入了。

浅谈Linux中的xargs命令

 

Dash软件中xargs命令的man page

看官可以尝试执行以下两对命令,看看输出有什么不同,能够加深理解:

同样地,上面例子中的kill命令应该改写成:

ps aux | grep redis-cli | grep -v grep | awk '{print $2}' | xargs kill -15

xargs命令本身也有一些参数,使用方法很灵活,下面再举几个例子。

~ echo '1,2,3,4,5' | xargs -d ',' echo
1 2 3 4 5

特别地,用-0(注意是数字0)参数可以指定NULL字符''作为分隔符。

~ echo '1,2,3,4,5,6,7,8,9' | xargs -d ',' -n 4 echo
1 2 3 4
5 6 7 8
9
~ echo 'cd pwd ls ps' | xargs -E 'ls' echo
cd pwd
~ echo '1,2,3,4,5,6,7,8,9' | xargs -d ',' -n 4 -t echo
echo 1 2 3 4
1 2 3 4
echo 5 6 7 8
5 6 7 8
echo 9
9
# 计算表达式的值
~ echo '77' | xargs -I 'q' expr 2 * q + 8
162
# 批量重命名目录下的文件
~ ls | xargs -i mv {} {}.bak
# 批量复制目录下的文件
~ find . -name "*.jar" | xargs -i cp {} /opt/cloudera/jars

mv、cp等命令对参数列表的长度有限制,如果按普通方法一次操作太多文件,会报“Argument list too long”错误。而xargs每次传参时是以默认128KB的批次进行,所以一切正常。批次大小还可以用-s参数自行指定。

作者:LittleMagic

链接:https://www.jianshu.com/p/0aa07a901825

来源:简书

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>