linux find命令之xargs简单概述
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
使用实例:
实例1:查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
命令:
find.-typef-print|xargsfile
输出:
[root@localhosttest]#ll 总计312 -rw-r--r--1rootroot30210811-0306:19log2012.log -rw-r--r--1rootroot011-1222:25log2013.log -rw-r--r--1rootroot011-1222:25log2014.log drwxr-xr-x6rootroot409610-2701:58scf drwxrwxrwx2rootroot409611-1219:32test3 drwxrwxrwx2rootroot409611-1219:32test4 [root@localhosttest]#find.-typef-print|xargsfile ./log2014.log:empty ./log2013.log:empty ./log2012.log:ASCIItext [root@localhosttest]#
实例2:在整个系统中查找内存信息转储文件(coredump),然后把结果保存到/tmp/core.log文件中
命令:
find/-name"core"-print|xargsecho"">/tmp/core.log
输出:
[root@localhosttest]#find/-name"core"-print|xargsecho"">/tmp/core.log [root@localhosttest]#cd/tmp [root@localhosttmp]#ll 总计16 -rw-r--r--1rootroot152411-1222:29core.log drwx------2rootroot409611-1222:24ssh-TzcZDx1766 drwx------2rootroot409611-1222:28ssh-ykiRPk1815 drwx------2rootroot409611-0307:11vmware-root
实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限
命令:
find.-perm-7-print|xargschmodo-w
输出:
[root@localhosttest]#ll 总计312 -rw-r--r--1rootroot30210811-0306:19log2012.log -rw-r--r--1rootroot011-1222:25log2013.log -rw-r--r--1rootroot011-1222:25log2014.log drwxr-xr-x6rootroot409610-2701:58scf drwxrwxrwx2rootroot409611-1219:32test3 drwxrwxrwx2rootroot409611-1219:32test4 [root@localhosttest]#find.-perm-7-print|xargschmodo-w [root@localhosttest]#ll 总计312 -rw-r--r--1rootroot30210811-0306:19log2012.log -rw-r--r--1rootroot011-1222:25log2013.log -rw-r--r--1rootroot011-1222:25log2014.log drwxr-xr-x6rootroot409610-2701:58scf drwxrwxr-x2rootroot409611-1219:32test3 drwxrwxr-x2rootroot409611-1219:32test4 [root@localhosttest]#
说明:
执行命令后,文件夹scf、test3和test4的权限都发生改变
实例4:用grep命令在所有的普通文件中搜索hostname这个词
命令:
find.-typef-print|xargsgrep"hostname"
输出:
[root@localhosttest]#find.-typef-print|xargsgrep"hostname" ./log2013.log:hostnamebaidu=baidu.com ./log2013.log:hostnamesina=sina.com ./log2013.log:hostnames=true[root@localhosttest]#
实例5:用grep命令在当前目录下的所有普通文件中搜索hostnames这个词
命令:
find.-name\*-typef-print|xargsgrep"hostnames"
输出:
[root@peidatest]#find.-name\*-typef-print|xargsgrep"hostnames" ./log2013.log:hostnamesina=sina.com ./log2013.log:hostnames=true[root@localhosttest]#
说明:
注意,在上面的例子中,\用来取消find命令中的*在shell中的特殊含义。
实例6:使用xargs执行mv
命令:
find.-name"*.log"|xargs-imv{}test4
输出:
[root@localhosttest]#ll 总计316 -rw-r--r--1rootroot30210811-0306:19log2012.log -rw-r--r--1rootroot6111-1222:44log2013.log -rw-r--r--1rootroot011-1222:25log2014.log drwxr-xr-x6rootroot409610-2701:58scf drwxrwxr-x2rootroot409611-1222:54test3 drwxrwxr-x2rootroot409611-1219:32test4 [root@localhosttest]#cdtest4/ [root@localhosttest4]#ll 总计0 [root@localhosttest4]#cd.. [root@localhosttest]#find.-name"*.log"|xargs-imv{}test4 [root@localhosttest]#ll 总计12 drwxr-xr-x6rootroot409610-2701:58scf drwxrwxr-x2rootroot409611-1305:50test3 drwxrwxr-x2rootroot409611-1305:50test4 [root@localhosttest]#cdtest4/ [root@localhosttest4]#ll 总计304 -rw-r--r--1rootroot30210811-1222:54log2012.log -rw-r--r--1rootroot6111-1222:54log2013.log -rw-r--r--1rootroot011-1222:54log2014.log [root@localhosttest4]#
实例7:find后执行xargs提示xargs:argumentlinetoolong解决方法:
命令:
find.-typef-atime+0-print0|xargs-0-l1-trm-f
输出:
[root@pdtest4]#find.-typef-atime+0-print0|xargs-0-l1-trm-f rm-f [root@pdtest4]#
说明:
-l1是一次处理一个;-t是处理之前打印出命令
实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]
命令:
find.-name"file"|xargs-I[]cp[]..
输出:
[root@localhosttest]#ll 总计12 drwxr-xr-x6rootroot409610-2701:58scf drwxrwxr-x2rootroot409611-1305:50test3 drwxrwxr-x2rootroot409611-1305:50test4 [root@localhosttest]#cdtest4 [root@localhosttest4]#find.-name"file"|xargs-I[]cp[].. [root@localhosttest4]#ll 总计304 -rw-r--r--1rootroot30210811-1222:54log2012.log -rw-r--r--1rootroot6111-1222:54log2013.log -rw-r--r--1rootroot011-1222:54log2014.log [root@localhosttest4]#cd.. [root@localhosttest]#ll 总计316 -rw-r--r--1rootroot30210811-1306:03log2012.log -rw-r--r--1rootroot6111-1306:03log2013.log -rw-r--r--1rootroot011-1306:03log2014.log drwxr-xr-x6rootroot409610-2701:58scf drwxrwxr-x2rootroot409611-1305:50test3 drwxrwxr-x2rootroot409611-1305:50test4 [root@localhosttest]#
说明:
使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]
实例9:xargs的-p参数的使用
命令:
find.-name"*.log"|xargs-p-imv{}..
输出:
[root@localhosttest3]#ll 总计0 -rw-r--r--1rootroot011-1306:06log2015.log [root@localhosttest3]#cd.. [root@localhosttest]#ll 总计316 -rw-r--r--1rootroot30210811-1306:03log2012.log -rw-r--r--1rootroot6111-1306:03log2013.log -rw-r--r--1rootroot011-1306:03log2014.log drwxr-xr-x6rootroot409610-2701:58scf drwxrwxr-x2rootroot409611-1306:06test3 drwxrwxr-x2rootroot409611-1305:50test4 [root@localhosttest]#cdtest3 [root@localhosttest3]#find.-name"*.log"|xargs-p-imv{}.. mv./log2015.log..?...y [root@localhosttest3]#ll 总计0 [root@localhosttest3]#cd.. [root@localhosttest]#ll 总计316 -rw-r--r--1rootroot30210811-1306:03log2012.log -rw-r--r--1rootroot6111-1306:03log2013.log -rw-r--r--1rootroot011-1306:03log2014.log -rw-r--r--1rootroot011-1306:06log2015.log drwxr-xr-x6rootroot409610-2701:58scf drwxrwxr-x2rootroot409611-1306:08test3 drwxrwxr-x2rootroot409611-1305:50test4 [root@localhosttest]#
说明:
-p参数会提示让你确认是否执行后面的命令,y执行,n不执行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。