xargs 和 exec详解
exec主要和find一起配合使用,xargs比exec用的地方要多。
xargs应用
把管道符前面的输出作为xargs后面的命令的输入。好处在于可以简化步骤。常常和find一起使用,#find . -mtime +10 |xargs rm
(1)xargs可以批量修改文件名,更精准一点的说法是批量增加文件名。
[root@shiyanji tmp]# touch 1.txt 2.txt 3.txt 4.txt
[root@shiyanji tmp]# ls
1.txt 2.txt 3.txt 4.txt
[root@shiyanji tmp]# ls *.txt|xargs -n1 -i{} mv {} {}_bak ##-i{} 中间不能有空格 可以只跟-i
[root@shiyanji tmp]# ls
1.txt_bak 2.txt_bak 3.txt_bak 4.txt_bak
注:
xargs -n1 -i{} 类似for循环,-n1的意思是一个一个对象的去处理,-i{} 把前面列出的对象用{}取代,mv {} {}_bak 相当于重命名。很实用的命令,掌握。-n1可以省略不要!
(2)xargs可用于拷贝
[root@shiyanji tmp]# ls *.txt_bak |xargs -n1 -i{} cp {} /
[root@shiyanji tmp]# cd /
[root@shiyanji /]# ls
1.txt_bak 4.txt_bak dev lib mnt root srv usr
2.txt_bak bin etc lost+found opt sbin sys var
3.txt_bak boot home media proc selinux tmp
注:上面的操作意思是将/tmp目录下的*.txt_bak文件拷贝到根目录下。
(3)xargs可拷贝的时候进行重命名
[root@shiyanji tmp]# ls *.txt_bak |xargs -n1 -i{} cp {} /{}.bak ##/{}.bak中间没有空格
[root@shiyanji tmp]# cd /
[root@shiyanji /]# ls
1.txt_bak 3.txt_bak bin home mnt sbin tmp
1.txt_bak.bak 3.txt_bak.bak boot lib opt selinux usr
2.txt_bak 4.txt_bak dev lost+found proc srv var
2.txt_bak.bak 4.txt_bak.bak etc media root sys
注:上面的操作是将/tmp目录下的*.txt_bak拷贝到根目录并重命名为*.txt_bak.bak。
(4)xargs与find的配合使用
运用一:删除文件操作
[root@shiyanji ~]# cd /tmp
[root@shiyanji tmp]# ls
1.txt_bak 2.txt_bak 3.txt_bak 4.txt_bak filelist yum.log
[root@shiyanji ~]# find /tmp -name *.txt_bak |xargs -n1 -i{} rm -rf {}
[root@shiyanji ~]# cd /tmp
[root@shiyanji tmp]# ls
filelist yum.log
运用二:重命名文件操作
[root@shiyanji /]# cd /tmp
[root@shiyanji tmp]# ls
1.txt_bak 2.txt_bak 3.txt_bak 4.txt_bak filelist yum.log
[root@shiyanji ~]# find /tmp -name *.txt_bak |xargs -n1 -i{} mv {} {}.wtf
[root@shiyanji ~]# cd /tmp
[root@shiyanji tmp]# ls
1.txt_bak.wtf 2.txt_bak.wtf 3.txt_bak.wtf 4.txt_bak.wtf filelist yum.log
exec 应用
find命令时,经常使用一个选项就是 -exec,可以达到和xargs一样的效果。
运用一:删除文件
例1:[root@shiyanji ~]# find /tmp -name *.txt* -exec rm -rf {}\;##{}\中间要有空格!
find: 遗漏“-exec”的参数
[root@shiyanji ~]# find /tmp -name *.txt* -exec rm -rf {} \;
[root@shiyanji ~]# cd /tmp
[root@shiyanji tmp]# ls
filelist yum.log
例2:
#find . -mtime +10 -exec rm -rf {} \;
这个命令也是把{}作为前面find出来的文件的替代符,后面的\为;的脱意字符,不然脱意字符,shell会把这里的分号 ; 当做这个命令行
的结尾,认为后面还有其他的任务。-exec也能实现上面的更改文件名的需求。
运用二:重命名文件
[root@shiyanji tmp]# ls
1.txt_bak 2.txt_bak 3.txt_bak 4.txt_bak
[root@shiyanji tmp]# cd
[root@shiyanji ~]# find /tmp -name *.txt_bak -exec mv {} {}.wtf \;
[root@shiyanji ~]# cd /tmp
[root@shiyanji tmp]# ls
1.txt_bak.wtf 2.txt_bak.wtf 3.txt_bak.wtf 4.txt_bak.wtf
运用三:拷贝文件并重命名
[root@shiyanji ~]# find / -name *.txt_bak -exec cp {} /tmp/{}.www \;
[root@shiyanji ~]# cd /tmp
[root@shiyanji tmp]# ls
1.txt_bak.www 2.txt_bak.www 3.txt_bak.www 4.txt_bak.www