Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251898
  • 博文数量: 137
  • 博客积分: 5005
  • 博客等级: 上校
  • 技术积分: 1360
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-25 09:21
个人简介

每天进步一点点

文章分类

全部博文(137)

文章存档

2016年(1)

2013年(2)

2012年(30)

2011年(42)

2006年(27)

2005年(35)

分类:

2005-09-20 22:12:54

关于find的几点

1 怪异的语法

    1) find . -name name -exec command {} ;
    2) find . -name name -exec CMD1 {}; -exec CMD2 {};
 
2 奇怪的参数

   
    -regx 和-name的区别
    1).
 -name, -iname最大的区别就在于 -regex是把find输出的整个结果(有别于绝对路径名)作为要匹配的对象, 而不仅仅是结果
 的最后一部分, 举例
 /tmp
 目录下有且仅有 aaa, aa, 1, 2 这些文件
 find -name "a*"可以找到
 aaa和aa  
 而
 find /tmp -regex "a*"就不行, 它一个都找不到, 因为找到的每个结果是这样的
 /tmp/aaa
 /tmp/aa
 -name 是对结果中的"aaa"和"aa"这个部分进行匹配, 而-regex却是对完整的
 "/tmp/aaa"和"/tmp/aa"进行匹配.
 所以你要写作
 find /tmp -regex ".*a.*"

    2). 注意上面的是.*而不是*
 -name所能解释的是基于shell中file glob的匹配字符, 包括:

 (1)*表示任意长度字符串
 (2)?表示任意的单个字符
 (3)[set] 表示一个可选字符集合
 (4)[^set]或[!set]表示以ASCII为全集对[set] 求补集的一个集合
 (5)brace expansion, 即把/tmp/{a,b,c}扩展为三个字串
 /tmp/a /tmp/b 和/tmp/c
 注意 shell的file globing机制往往不被认为是正则表达式.

 -regex接受的是"正统"的正则表达式
 这个说起来东西多了, 基本上它跟emacs文档里讲的regex是一样的, 因为find手册里regex的解释部分实际就是
 链接到emacs 中讲解regex的那个部分. 在上面例子中最大区别就是
 .* 来表示任意长度字符串.

3  与grep诡异的结合

 
 只匹配一个字符串的查找,可以用下面的命令实现:
    find . -name '*.cpp'  -exec grep  "Music and Sounds" {} ;   -print  
 那如果我要同时匹配几个字符串呢,比如:“Music and Sounds”、“main” 如何实现?

 grep 'main' `find . -name '*.cpp'  -exec grep  "Music and Sounds" -l {} ;` -l

阅读(1198) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~