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
find与xargs搭配使用,可以让工作变得更加轻松。
例:
find . -type f -name "*.txt" -print0 |xargs rm -f
很多文件中都可能包含有空格符(‘ ’),所以find命令输出的结果的定界符不确实是(’/n’)还是空格,所以搭配xargs删除某指定类型文件时候,应该使用print0与find搭配,以字符“\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 {} \;