linux中find命令的用法
一、我们知道grep,egrep,fgrep是查找文本的,下面我们就来了解一下用于查找文件的命令。文件查找:locate ,find,find命令非常强大,在这里我只是把find的部分命令和功能说了一下,如find的功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。又如find语法:find起始目录寻找条件操作  说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作,以下就是find命令的用法及其功能
1、locate:
      非实时,模糊匹配,查找是根据全系统文件数据库进行的;手动生成文件数据库:updatedb,速度快
2、find:
实时、精确、支持众多查找标准、遍历指定目录中的所有文件完成查找,查找非常准确但速度慢
格式:find 查找路径 查找标准 查找到以后的处理运作
查找路径:默认为当前路径  
查找标准:默认为指定路径下的所有文件   
查找到后的处理运作:默认为显示
3、find匹配标准:
-name‘FILENAME’:对文件名做精确匹配
 如:find /etc -name 'passwd'
  文件名通配:
       *;任意长度的任意字符
        ?:匹配其前面的字符一次或0次
          []:匹配指定范围内的任意单个字符
 -iname:文件名匹配时不区分大小写
 -regex PATTERN:基于正则表达式进行文件名匹配
 -user USERNAME:根据属主查找
   如查找/tmp下属主是hadoop的文件:find /tmp -user hadoop
 -group GROUPNAME:根据属组查找
 -uid UID:根据UID查找
   如 find /tmp -uid 2003
 -gid GID:根据GID查找
 -nouser:查找没有属主的文件
   如查找/tmp下没有属主的文件:find /tmp -nouser
 -nogroup;查找没有属组的文件
 -type: 类型查找 f(普通文件),d目录),c(字符设备),b(块设备),
 l(链接文件),s(套接字文件),p(管道)
    如 find /tmp -type s
 -size [+|-]#K、#G、#M :大小查找
    +K:大于k的
    -K:小于K的
    K:精确查找大小为K的
  如find /tmp -size 1K -ls(精确查找)
二、为了便于查找,我们可不可以把有些命令组合起来,帮助我们快速查找文件呢?
这个当然可以啦,下面我们来了解一下组合命令的使用; 
1、组合条件:
 -a:与
 -o: 或 优先级最低
 -not:非 优先级最高

     如find /tmp -not -type d:查找非目录,
  如查找/tmp/test 属主不是user也不是user2的
   find /tmp -not -user user1 -a -not -user user2,也可以写成
       find  /tmp -not \(-user user1 -o -user user2\)。(运用的摩根定律)
  如查找/tmp下不是目录,并且还不能是套接字类型的文件
  find /tmp -not -type d -a -not -type s
    -mtime:修改时间(单位天)([+-]#  +:至少#天  -:#天之内)
 -ctime:改变时间 find ./ -mtime -5
 -atime:访问时间
 -mmin:修改时间((单位分钟)
 -cmin:改变时间
 -amin:访问时间
 -perm MODE:精确匹配 ,根据权限查找
 -perm /MODE:有一个匹配就行
  如find ./ -perm /644
 -perm -MODE:文件权限能完全包含此MODE时才能显示
   find ./ -perm -001 :查找其他文件有执行权限的
2、运作:
    -print:(默认)显示,将查找到的文件输出到标准输出
 -ls :类似ls-l的形式显示每一个文件的详细信息
 -ok COMMAND {} \:每一次操作都需要用户确认
 -exec COMMAND {} \:不需要用户确认
   find ./ -perm -006 -exec chmod o-w {} \;
   find ./ -perm -020 -exec mv {} {}.new\; 改名字,只要引用文件的文件名就要用{}
  查找家目录下所有以.sh结尾,并且所有用户都具有执行权限,把其他用户的执行权限去掉
  find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \;
 -xargs:从标准输入接收命令并执行
    find /etc -size +1M | xargs echo >> /tmp/etc.largefiles
3、下面我们来运用一下find命令
1)、查找/var目录下属主为root并且属组为mail的所有文件;
看到这个题目你的思路是什么?我首先会想到要用组合条件:与关系-a ,查看属主用-user,
属组用-group,那这个题就迎刃而解啦,非常简单
find /var -user root -a -group mail
2)、查找/usr目录下不属于root,bin,或student的文件;
用到了组合条件的非、与(-not,-a)
find /usr -not -user root -a -not -user bin -a -not -user student
3)、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
这里有几个关键词:“最近一周、内容修改过、且、不属于”“ -mtime -7 、-not 、-a"
find /etc -mtime -7 -not -user root -a -not -user student
4)、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
这题和上题类似,但比它要求多了,要求要修改属主属组用chown,也用到了-exec,切记用{} \ ;结尾
find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;
5)、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;
用到了-size大小,还有我们前面学到的输出重定向中的>>追加,也可以用-xargs,但要用命令管道,
相比之下还是第一种比较容易理解
find /etc -size +1M >> /tmp/etc.largefiles
find /etc -size +1M | xargs echo >> /tmp/etc.largefiles
6)、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
修改权限用-perm,首先我们先想到所有用户都没有写权限为222,并且都要满足用-perm -222
如果取反为 -not -perm /222
find /etc -not -perm /222 -ls

怎么样你都作对了吗?呵呵,这就是find命令的功能,其实并不难
只要能熟练掌握并运用了find命令,你会发现它的功能要远远超出你的想象。