Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101543
  • 博文数量: 35
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 302
  • 用 户 组: 普通用户
  • 注册时间: 2017-02-07 17:04
个人简介

不积跬步无以至千里,每天进步一点点~

文章分类

全部博文(35)

文章存档

2018年(3)

2017年(32)

我的朋友

分类: LINUX

2017-12-05 15:02:05

通常我们对find找到的文件会执行某些操作,exec选项是一个很好的选择,-exec之后跟执行的指令及一个{}和;,如find /usr/src/linux/ -name "*.o" -exec rm -f {} ;,

如果执行命令时希望有一次确认的机会则可使用ok选项,如find /usr/src/linux/ -name "*.o" -ok rm -f {} ;。
如果find结果文件太多-exec怎么办?
使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。

不幸的是,有些系统对能够传递给exec 的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。

这就是xargs命令的用处所在,特别是与find命令一起使用。

Find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,

不像-exec 选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,

并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

看看xargs命令是如何同find命令一起使用的,以下是一些例子。

下面的例子在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log

下面的例子在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
$ find /apps/audit -perm -7 -print | xargs chmod o-w

在下面的例子中,我们用grep命令在所有的普通文件中搜索device这个词:
$ find / -type f -print | xargs grep "device"


整理的find,exec,xargc的用法,从网上找到一些简单的基本用法,供大家参考



find /etc/rc.d -name '*crond' -exec file {} \;

查找/etc/rc.d目录下面所有以crond结束的文件,并使用file指令查看其属性,注意:exec和file间是一个空格,file和{}间是一个空格,{}和\;之间是一个空格,\;是一个整体。

find ./ -type -mtime +5 -maxdepth 1 -exec rm -rf {} \;
find ./ -type -ctime +30 | xargs rm -f

-exec 选项可用于您能够想象到的所有用途。例如:

find . -empty -exec rm '{}' \; 

删除目录树中的所有空文件

find . -name "*.htm" -exec mv '{}' '{}l' \; 

将所有 .htm 文件重命名为 .html 文件。

由于exec 能接受的长度有些系统会有限制
所以xargs 就有了其伟大价值

xargs 接到参数就开始处理 而不是像exec 那样土鳖 非要接受到全部

如 果在find命令后加上 -exec,就可以把找出来的东西进行操作,通常用-exec会提示这样的错误:“find: missing argument to `-exec’”,这是由于 -exec 需要以 “\;” 作为命令的终结符,加上它就不会出现缺少参数的错误提示。

简单用法:

find tmp/binary/ -name “*909150827*” -exec more {} \;

找到相关的文件然后more一下

还有就是删除所有.tmp的临时文件

find / -name “*.tmp” -exec rm -f {} \;


exec 与 xargs的区别

xargs:通过缓冲方式并以前面命令行的输出作为参数,随后的命令调用该参数

若忽略 xargs 的 options 来看的话,
cm1 | xargs cm2
可以单纯看成: cm2 `cm1`
因此, find .... | xargs rm 也可作 rm `find ...` 来处理.
然而, 若 find 的结果太多, 可能会超过rm 可能接受的最大argument数量而失败.
xargs优点:由于是批处理的,所以执行效率比较高(通过缓冲方式)
xargs缺点:有可能由于参数数量过多(成千上万),导致后面的命令执行失败
若换成 find ....-execrm {} \; 的话,
因为rm 是"逐个" item 去处理的, 则无此忧虑
例子:(在当前目录下查找包含hello字符的文件)
1。最傻方法:grep hello * **/*
2。使用exec
[admin@b2b_search_115 test]$ find . -type f -print -exec grep "hello" {} \;
./file/test3
hello
./test1
hello
./test2
3。使用xargs
[admin@b2b_search_115 test]$ find . -type f -print | xargs grep hello     
./file/test3:hello
./test1:hello
转自
http://blog.sina.com.cn/s/blog_3cf5c5ca0100pfqy.html
阅读(1184) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~