xargs:

 

xargs擅长将标准输入数据转换成命令行参数,xargs能处理stdin并将其转换为特定的命令行参数,也可以将单行或者多行的文本输入转换成其他格式。

xargs的作用就是将管道符前面输入的内容作为xargs后面命令的输入,它的好处是可以将多步才能完成的任务合并成一步。(常与find搭配使用)

 

命令格式:command |xargs command

例:

find  /var/log -mtime +10 |xargs rm-f

 

实际应用:

1.将多行输入转换成单行输出:

[root@one ~]# cat 11111.txt a b c de f gh ig [root@one ~]# cat 11111.txt |xargsa b c d e f g h i g

 

2.单行输入转换成多行输入:xargs -n

默认输出以空格为定界符。-n指定每行输入的最多参数。

[root@one ~]# cat 222.txtq w e r ta s d f gz x c v b[root@one ~]# cat 222.txt|xargs -n 2q we rt as df gz xc vb

3.指定定界符:xargs  -d

[root@one ~]# echo "appleAappleAappleA"|xargs -d Aapple apple apple

 

4.读取输入信息,将格式化参数传递给命令。

例:将脚本需要的参数写入test.txt文件中下,通过xargs传递给脚本test.sh

cat test.txt |xargs -n 1 ./test.sh

 

5.结合find使用xargs

findxargs搭配使用,可以让工作变得更加轻松。

例:

find . -type f -name "*.txt" -print0 |xargs rm -f

很多文件中都可能包含有空格符(  ),所以find命令输出的结果的定界符不确实是(/n)还是空格,所以搭配xargs删除某指定类型文件时候,应该使用print0find搭配,以字符“\0”为分隔符。

[root@one ~]# find . -type f -name "*.txt" -print./test.txt./shell/1212.txt./1.txt./222.txt[root@one ~]# find . -type f -name "*.txt" -print0./test.txt./shell/1212.txt./1.txt./222.txt

 

6.批量修改文件后缀名:

 

[root@one 111]# touch 1.txt 2.txt 3.txt[root@one 111]# ls1.txt  1.txt.gz  2.txt  3.txt[root@one 111]# rm -f 1.txt.gz [root@one 111]# ls1.txt  2.txt  3.txt[root@one 111]# ls *.txt|xargs -n 1 -i{} mv {} {}_bak[root@one 111]# ls1.txt_bak  2.txt_bak  3.txt_bak

xargs -n1 -i{}类似于for循环,-n 1每一行输出一个对象,-i{}用意是吧前面的对象用{}来代替。

mv {} {}_bak相当于mv 1.txt 1.txt_bak

 

exec:

xargs相似的命令exec

find-exec搭配一样的很强大。

例:

查找当前木创建时间大于10天的文件并删除:

find . -mtime +10 -exec rm -rf {} \;

//此命令是把{}作为前面find查找出来的文件的代替符,后面的\是;的脱意符,不然shell会把分号作为是该行命令的结尾,就只能把find找出的第一个文件删除,其他文件依然存在。

把某用户的全部文件所有权限更改成另一个用户。

find . -type f -user root -exec chown user1 {} \;

 

-exec如何结合多个命令:

exec的缺陷是只能接受单个命令,想直接执行多个命令怎么办呢?

我们可以把多个命令写在一个脚本当中去,然后让-exec去执行这个脚本。

 

-exec ./commands.sh {} \;