Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86165
  • 博文数量: 15
  • 博客积分: 581
  • 博客等级: 中士
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-23 15:29
文章分类
文章存档

2009年(10)

2008年(5)

我的朋友

分类: LINUX

2008-10-31 15:56:22

linux find -prune -name -wholename -regex -exec -exec command {} + ;

1.find 命令的格式
find [全局选项][要搜索的的文件夹]表达式
其中每个表达式又依由三部分组成: 局部选项(option),测试(test),命令(action).这三部分之间都用逻辑操作符(operator)与或非连接起来.操作符可以省略,这时候就用默认的"与"来连接.表达式可以多个,表达式之间也用逻辑操作符连接.
2.find 命令的执行过程
[全局选项][要搜索的的文件夹]容易理解,难点是表达式部分.组成表达式的三部分都是有返回值的(true或者false).find命令从左到右执行各个表达式的各个部分,如果碰到返回值是false的部分,则不继续执行后面的部分.
3. 例子
㈠.查找当前目录下的cpp源文件,不查找子文件夹
find . -maxdepth 1 -name *.cpp -print
不同的颜色代表find命令的不同部分.其中没有全局选项.
当不指定要搜索的目录和要执行的命令时,默认搜索的是当前目录,默认执行的是-print命令,所以上面的命令可以简化为:
find -maxdepth 1 -name *.cpp
其中的-maxdepth 1 指明只搜索第一层文件夹,而不递归搜索子文件夹
㈡.查询当前目录有哪些文件夹,不查找source文件夹
find -type d \( -name source -prune -o -print \)
分析: 上面的命令中,先执行测试-type d,判断它是否目录;如果它是目录,则还要执行括号里的内容.在括号里,先测试它的名字是否source,如果是,则执行-prune(不查找source这个目录),而-prune总是返回true的,所以用逻辑或(-o)连接起来的 -print 就不用执行了(因为一个"或"表达式的前半部分为true就无论后半部分为true或false,整个"或"表达式都为true);如果它的名字不为source,就输出它的名字
注意括号两边的空格,以及要加上转义字符(不然,括号就会被shell所解释,而不是被find命令解释了)
㈢.删除上例中找到的文件夹,而不是输出它的名字
find -type d \( -name source -prune -o -exec rm -ri {} \; \)
对找到的符合条件的文件夹都执行一次rm命令, -ri 和 {} 是传递给rm的参数,其中{}会被换成找到的文件夹的名字.rm的参数为rm之后,分号(;)前的所有东西.分号前的转义字符的作用和括号前的一样
如果用命令
find -type d \( -name source -prune -o -exec rm -ri {}+ \; \)
则只会执行一次rm
例如,如果找到了aa和bb两个文件夹,则前一条命令会执行两次rm,即rm -ri aa和rm -ri bb,而后一条命令则会把找到的文件夹名集合起来,一起放到rm后面(如果找到的文件夹过多,可能会分开多次),即执行
rm -ri aa bb.这样因为少执行了命令次数,所以效率会高一些
㈣. -name -wholename -regex的区别
-name 只看文件名,-wholename和-regex连路径也检查
-name和-wholename只能使用和shell差不多的通配符,而-regex可以使用正则表达式
阅读(2380) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:笔记

给主人留下些什么吧!~~

chinaunix网友2010-06-10 15:16:00