2023年7月26日发(作者:)
linuxfind命令之xargs简单概述在使⽤ find命令的-exec选项处理匹配到的⽂件时, find命令将所有匹配到的⽂件⼀起传递给exec执⾏。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运⾏⼏分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的⽤处所在,特别是与find命令⼀起使⽤。find命令把匹配到的⽂件传递给xargs命令,⽽xargs命令每次只获取⼀部分⽂件⽽不是全部,不像-exec选项那样。这样它可以先处理最先获取的⼀部分⽂件,然后是下⼀批,并如此继续下去。在有些系统中,使⽤-exec选项会为处理每⼀个匹配到的⽂件⽽发起⼀个相应的进程,并⾮将匹配到的⽂件全部作为参数⼀次执⾏;这样在有些情况下就会出现进程过多,系统性能下降的问题,因⽽效率不⾼; ⽽使⽤xargs命令则只有⼀个进程。另外,在使⽤xargs命令时,究竟是⼀次获取所有的参数,还是分批取得参数,以及每⼀次获取参数的数⽬都会根据该命令的选项及系统内核中相应的可调参数来确定。使⽤实例:实例1: 查找系统中的每⼀个普通⽂件,然后使⽤xargs命令来测试它们分别属于哪类⽂件命令:find . -type f -print | xargs file输出:[root@localhost test]# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 -rw-r--r-- 1 root root 0 11-12 22:25 -rw-r--r-- 1 root root 0 11-12 22:25 xr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxrwx 2 root root 4096 11-12 19:32 test3drwxrwxrwx 2 root root 4096 11-12 19:32 test4[root@localhost test]# find . -type f -print | xargs file./: empty./: empty./: ASCII text[root@localhost test]#实例2:在整个系统中查找内存信息转储⽂件(core dump) ,然后把结果保存到/tmp/ ⽂件中命令: find / -name "core" -print | xargs echo "" >/tmp/输出:[root@localhost test]# find / -name "core" -print | xargs echo "" >/tmp/[root@localhost test]# cd /tmp[root@localhost tmp]# ll总计 16-rw-r--r-- 1 root root 1524 11-12 22:29 x------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815drwx------ 2 root root 4096 11-03 07:11 vmware-root实例3:在当前⽬录下查找所有⽤户具有读、写和执⾏权限的⽂件,并收回相应的写权限命令:find . -perm -7 -print | xargs chmod o-w输出:[root@localhost test]# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 -rw-r--r-- 1 root root 0 11-12 22:25 -rw-r--r-- 1 root root 0 11-12 22:25 xr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxrwx 2 root root 4096 11-12 19:32 test3drwxrwxrwx 2 root root 4096 11-12 19:32 test4[root@localhost test]# find . -perm -7 -print | xargs chmod o-w[root@localhost test]# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 -rw-r--r-- 1 root root 0 11-12 22:25 -rw-r--r-- 1 root root 0 11-12 22:25 xr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-12 19:32 test3drwxrwxr-x 2 root root 4096 11-12 19:32 test4[root@localhost test]#说明:执⾏命令后,⽂件夹scf、test3和test4的权限都发⽣改变实例4:⽤grep命令在所有的普通⽂件中搜索hostname这个词命令:find . -type f -print | xargs grep "hostname"输出:[root@localhost test]# find . -type f -print | xargs grep "hostname"./:hostnamebaidu=./:hostnamesina=./:hostnames=true[root@localhost test]#实例5:⽤grep命令在当前⽬录下的所有普通⽂件中搜索hostnames这个词命令:find . -name * -type f -print | xargs grep "hostnames"输出:[root@peida test]# find . -name * -type f -print | xargs grep "hostnames"./:hostnamesina=./:hostnames=true[root@localhost test]#说明:注意,在上⾯的例⼦中, ⽤来取消find命令中的*在shell中的特殊含义。实例6:使⽤xargs执⾏mv命令:find . -name "*.log" | xargs -i mv {} test4输出:[root@localhost test]# ll总计 316-rw-r--r-- 1 root root 302108 11-03 06:19 -rw-r--r-- 1 root root 61 11-12 22:44 -rw-r--r-- 1 root root 0 11-12 22:25 xr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-12 22:54 test3drwxrwxr-x 2 root root 4096 11-12 19:32 test4[root@localhost test]# cd test4/[root@localhost test4]# ll总计 0[root@localhost test4]# cd ..[root@localhost test]# find . -name "*.log" | xargs -i mv {} test4[root@localhost test]# ll总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-13 05:50 test3drwxrwxr-x 2 root root 4096 11-13 05:50 test4[root@localhost test]# cd test4/[root@localhost test4]# ll总计 304-rw-r--r-- 1 root root 302108 11-12 22:54 -rw-r--r-- 1 root root 61 11-12 22:54 -rw-r--r-- 1 root root 0 11-12 22:54 [root@localhost test4]#实例7:find后执⾏xargs提⽰xargs: argument line too long解决⽅法:命令:find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f输出:[root@pd test4]# find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -frm -f
[root@pdtest4]#说明:-l1是⼀次处理⼀个;-t是处理之前打印出命令实例8:使⽤-i参数默认的前⾯输出⽤{}代替,-I参数可以指定其他代替字符,如例⼦中的[]命令:find . -name "file" | xargs -I [] cp [] ..输出:[root@localhost test]# ll总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-13 05:50 test3drwxrwxr-x 2 root root 4096 11-13 05:50 test4[root@localhost test]# cd test4[root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..[root@localhost test4]# ll总计 304-rw-r--r-- 1 root root 302108 11-12 22:54 -rw-r--r-- 1 root root 61 11-12 22:54 -rw-r--r-- 1 root root 0 11-12 22:54 [root@localhost test4]# cd ..[root@localhost test]# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 -rw-r--r-- 1 root root 61 11-13 06:03 -rw-r--r-- 1 root root 0 11-13 06:03 xr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-13 05:50 test3drwxrwxr-x 2 root root 4096 11-13 05:50 test4[root@localhost test]#说明:使⽤-i参数默认的前⾯输出⽤{}代替,-I参数可以指定其他代替字符,如例⼦中的[]实例9:xargs的-p参数的使⽤命令:find . -name "*.log" | xargs -p -i mv {} ..输出:[root@localhost test3]# ll总计 0-rw-r--r-- 1 root root 0 11-13 06:06 [root@localhost test3]# cd ..[root@localhost test]# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 -rw-r--r-- 1 root root 61 11-13 06:03 -rw-r--r-- 1 root root 0 11-13 06:03 xr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-13 06:06 test3drwxrwxr-x 2 root root 4096 11-13 05:50 test4[root@localhost test]# cd test3[root@localhost test3]# find . -name "*.log" | xargs -p -i mv {} ..mv ./ .. ?...y[root@localhost test3]# ll总计 0[root@localhost test3]# cd ..[root@localhost test]# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 -rw-r--r-- 1 root root 61 11-13 06:03 -rw-r--r-- 1 root root 0 11-13 06:03 -rw-r--r-- 1 root root 0 11-13 06:06 xr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-13 06:08 test3drwxrwxr-x 2 root root 4096 11-13 05:50 test4[root@localhost test]#说明:-p参数会提⽰让你确认是否执⾏后⾯的命令,y执⾏,n不执⾏。以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690361609a337863.html
评论列表(0条)