find是linux命令,它将档案系统内符合expression的档案列出来,你可以指要档案的名称、类别、时间、大小、权限等不同命令的组合,只有完全相符的才会被列出来。

find可以在当前目录下甚至整个文件系统来查找某些文件或目录;

注意:find命令是相当耗资源的不得以的时候不要find的,比如说根 / 目录;

功能说明:查找文件或目录

   find-->实时查找:速度慢、精确匹配

命令语法:

find [options] [查找路径] [查找条件] [处理动作]

   查找路径:默认为当前目录

   查找条件:默认为查找指定路径下的所有文件

   处理动作:默认为显示

下面就来一起看下find的用法吧:

1.查找条件:根据文件名称查找时是严格区分字母大小写的

  -name "文件名称": 支持使用globbing

       *  :重复0次或者任意多次前面字符

       ? :单个字符  

       [] :字符范围

       [^]:排除字符范围

应用实例:

1).查看/etc目录下有多少passwd文件:

[root@xiaomazi ~]#[root@xiaomazi ~]#  find /etc -name "passwd"/etc/pam.d/passwd/etc/passwd[root@xiaomazi ~]#

2).查看/etc目录下所有以passwd开头的文件:

[root@xiaomazi ~]#  find /etc -name "passwd*"/etc/pam.d/passwd/etc/passwd-/etc/passwd[root@xiaomazi ~]#

3).查看/etc目录下所有以passwd结尾的文件:

[root@xiaomazi ~]#  find /etc -name "*passwd"/etc/pam.d/passwd/etc/passwd/etc/security/opasswd[root@xiaomazi ~]#

2.-iname "文件名称":查找时不区分字符大小写

应用举例:

1).查找/etc下所有以passwd开头的文件(并不区分大小写):

[root@xiaomazi ~]# touch /etc/Passwd -->创建测试文件[root@xiaomazi ~]# find /etc -iname "passwd*"/etc/pam.d/passwd/etc/passwd-/etc/passwd/etc/Passwd[root@xiaomazi ~]# rm -rf /etc/Passwd注意不要再/etc目录下随便创建文件吆.

3.  根据属主属组来查找:

     -user UserName: 根据属主查找

     -group GroupName: 根据属组查找

应用举例:

1).查找文件的属主是hadoop用户的文件:

[root@xiaomazi ~]# su - hadoop[hadoop@xiaomazi ~]$ cp/etc/fstab/tmp/-->注意以谁的身份复制文件,文件的属主属组就是谁的.[hadoop@xiaomazi ~]$ ls-l /tmp/total 28-rw-r--r--   1 hadoop hadoop  921 Feb 26 18:14 fstab[hadoop@xiaomazi ~]$[root@xiaomazi ~]# find /tmp -user hadoop/tmp/fstab[root@xiaomazi ~]#

2).查找文件的属组是hadoop用户的文件:

[root@xiaomazi ~]# find /tmp -group hadoop/tmp/fstab[root@xiaomazi ~]#

4.根据UID/GID来查找:

    -uid UID

    -gid GID

  如果我将fedora用户删除,没有加选项-r,就不会删除用户文件的;如果文件的属主属组不在了,会发生什么问题呢?但是,如果此前不确定用户名,也可以使用uid的;

应用举例:

1).查找/tmp目录下uid是501的所有文件:

[root@xiaomazi ~]# useradd fedora -->创建用户[root@xiaomazi ~]# su - fedora -->切换到fedora用户[fedora@xiaomazi ~]$ cp/etc/inittab/tmp/-->以fedora用户来复制文件[fedora@xiaomazi ~]$ ls-l /tmp/total 28-rw-r--r--   1 hadoop hadoop  921 Feb 26 18:14 fstab-rw-r--r--   1 fedora fedora  884 Feb 26 18:22 inittab[fedora@xiaomazi ~]$ exitlogout[root@xiaomazi ~]# userdel fedora -->模拟删除用户[root@xiaomazi ~]# ls -l /tmp/total 28-rw-r--r--   1 hadoop hadoop  921 Feb 26 18:14 fstab-rw-r--r--   1    501    501  884 Feb 26 18:22 inittab  -->注意:现在属主属组属于501[root@xiaomazi ~]# find /tmp -user fedroa -->这是找不到的啦!find: `fedroa' is not the name of a known user[root@xiaomazi ~]# find /tmp -uid 501 -->假设我们知道fedora的uid,就可以全局范围的查找fedora的文件了./tmp/inittab[root@xiaomazi ~]#

5.根据-nouser、-nogroup: 查找没有属主、属组的文件;

  -nouser:查找没有属主的文件,即该文件的属主在/etc/passwd中不存在。

  -nogroup: 查找没有属组的文件,即该文件所属的组在/etc/group中不存在。

应用举例:

1).假如说现在就在系统上找没有属主的文件应该怎么样找呢?

[root@xiaomazi ~]# find /tmp -nouser/tmp/inittab[root@xiaomazi ~]#

6.组合条件:

   -a: 与,同时满足(可以不写的)

   -o: 或,表示一个满足就可以
   -not, !:非,取反

应用举例:

1).查找/tmp目录下没有属主或属主为hadoop的文件:

[root@xiaomazi ~]# find /tmp -nouser -o -user hadoop/tmp/inittab/tmp/fstab[root@xiaomazi ~]#

2).查找/tmp目录下属主为hadoop,并且文件以.txt结尾的文件:

[hadoop@xiaomazi ~]$ whoamihadoop -->当前用户[hadoop@xiaomazi ~]$ cd /tmp/[hadoop@xiaomazi tmp]$ touch word.doc hello.txt[hadoop@xiaomazi tmp]$ ll -->新建文件以便测试.total 28-rw-r--r--   1hadoop hadoop  921Feb 2618:14fstab-rw-rw-r--   1hadoop hadoop    0Feb 2618:58hello.txt-rw-r--r--   1501501884Feb 2618:22inittab-rw-rw-r--   1hadoop hadoop    0Feb 2618:58word.docroot用户[root@xiaomazi ~]# find /tmp -user hadoop -name "*.txt"/tmp/hello.txt[root@xiaomazi ~]#

3).查找/tmp目录下属主为hadoop,并且也不是以.txt结尾的文件:

[root@xiaomazi ~]# find /tmp -user hadoop -a -not -name "*.txt"/tmp/fstab/tmp/word.doc[root@xiaomazi ~]#

4).查找/tmp目录下属主不是hadoop,并且也不是以.txt结尾的文件

 I.使用的是-a选项:

[root@xiaomazi tmp]# find /tmp -not -user hadoop -a -not -name "*.txt"/tmp/tmp/inittab/tmp/.ICE-unix[root@xiaomazi tmp]#

 II.使用的是-o选项:

[root@xiaomazi tmp]#[root@xiaomazi tmp]# find /tmp -not \( -user hadoop -o -name "*.txt" \)/tmp/tmp/inittab/tmp/.ICE-unix[root@xiaomazi tmp]#

5).查找/tmp目录下属主不是hadoop,或者不是以.txt结尾的:

[root@xiaomazi tmp]# find /tmp -not -user hadoop -o -not -name "*.txt"/tmp/tmp/inittab/tmp/fstab/tmp/word.doc/tmp/.ICE-unix[root@xiaomazi tmp]#

6.根据文件类型查找:

   -type: 根据文件类型查找

       f: 普通文件
       d: 目录
       b: 块设备
       c: 字符设备
       l: 符号链接文件
       p: 命名管道
       s: 套接字

应用举例:

1).将/tmp目录下的目录显示出来:

[root@xiaomazi tmp]# find /tmp -type d/tmp/tmp/.ICE-unix[root@xiaomazi tmp]#

2).查找/tmp目录下的普通文件显示出来:

[root@xiaomazi tmp]# find /tmp -type f/tmp/inittab/tmp/fstab/tmp/word.doc/tmp/hello.txt[root@xiaomazi tmp]#

7.根据文件大小查找:

   -size: 根据文件大小查找

       -size [+|-]#Unit
        例如:-size +2MB (+表示大于)
        常用单位:k, M, G

文件查找的一个比较独特的地方,当我们以某个单位指定以后,只要在单位变化范围内1范围内的变化的都符合条件;

注意:

I.小于:
   小于-1M:表示0M以下的所有文件是小于-1M的;
   小于-2M:表示1M以下的所有文件是小于-2M的;
   小于-3M:表示2M以下的所有文件是小于-3M的;
   小于-4M:表示3M以下的所有文件是小于-4M的;
II.大于:
   大于+1M:表示1M以上的所有文件是大于+1M的;
III.不加+-号
   1M的表示:只要在单位变化范围内1M范围内的变化的都符合条件.

应用举例:

1).查找/var/log目录下的文件是在1M以内的显示出来:

[root@xiaomazi tmp]# find /var/log -size 1M/var/log/var/log/ConsoleKit/var/log/ConsoleKit/history.../var/log/maillog-20140226[root@xiaomazi tmp]#

2).查找/var/log目录下的文件是大于1M的显示出来:

[root@xiaomazi tmp]# find /var/log -size +1M[root@xiaomazi tmp]# 没有查到

3).查找/var/log目录下的文件是小于1M的显示出来:

[root@xiaomazi tmp]# find /var/log -size -1M/var/log/spice-vdagent.log/var/log/tallylog/var/log/spooler/var/log/wpa_supplicant.log/var/log/spooler-20140226/var/log/maillog[root@xiaomazi tmp]#

8.根据时间戳查找:

   根据时间戳查找:

       以天为单位(time):访问时间
           -atime [+|-]#
               +: 表示(#+1)天之外被访问过;
               -: 表示#天之内被访问过;
               无符号:表示短于(#+1)> x >=#天的时间段被访问过;    
           -mtime:修改时间
           -ctime:创建时间

       以分钟为单位(min):
           -amin [+|-]#:访问时间
           -mmin:修改时间
           -cmin:创建时间

应用举例:

1).查找/var/log目录下的最近一天内编辑过的文件:

[root@xiaomazi tmp]# find /var/log -atime -1/var/log/var/log/dmesg/var/log/sa/var/log/sa/sa26/var/log/maillog/var/log/messages[root@xiaomazi tmp]#

2).查找/var/log目录下刚好在一天内编辑过的文件:

[root@xiaomazi tmp]# find /var/log -atime 1/var/log/var/log/yum.log/var/log/maillog-20140226[root@xiaomazi tmp]#

3).查找/var/log目录下刚好在一天之外编辑过的文件:

[root@xiaomazi tmp]# find /var/log -atime +1/var/log/ConsoleKit/history/var/log/audit/audit.log/var/log/sa/sa09/var/log/anaconda.storage.log/var/log/maillog-20140226[root@xiaomazi tmp]#

4).在/home下查60分钟前改动过的文件find /home -mmin  +60                    

5).查最近30分钟前被存取过的文件find /home -amin +30  

9.根据权限查找:

   根据权限查找:

       -perm [+|-]MODE
            MODE:精确匹配
            +MODE: 任何一类用户的任何一位权限匹配;常用于查找某类用户的某特定权限是否存在;
            -MODE: 每类用户的指定要检查的权限位都匹配;

应用举例:

1).查找/var/log目录下权限为600的文件:

[root@xiaomazi tmp]# find /var/log -perm 600/var/log/audit/audit.log/var/log/spice-vdagent.log/var/log/cron-20140226/var/log/tallylog/var/log/btmp/var/log/cron/var/log/spooler/var/log/messages-20140226/var/log/anaconda.log/var/log/secure-20140226/var/log/anaconda.yum.log/var/log/secure/var/log/spooler-20140226/var/log/anaconda.syslog/var/log/anaconda.program.log/var/log/anaconda.ifcfg.log/var/log/maillog/var/log/anaconda.storage.log/var/log/messages/var/log/maillog-20140226[root@xiaomazi tmp]#[root@xiaomazi tmp]# ls -l /var/log -->可以看下的权限的

2).查找/tmp目录下为写的权限的文件,创建文件并测试:

[root@xiaomazi tmp]# mkdir test[root@xiaomazi tmp]# cd test/[root@xiaomazi test]# touch hello.txt[root@xiaomazi test]# lshello.txt[root@xiaomazi test]# find ./ -perm +222././hello.txt[root@xiaomazi test]#

3).查找/tmp目录下所有其他用户有写的权限的文件:

[root@xiaomazi test]# find ./ -perm 002[root@xiaomazi test]# --> 没有

4).查找/etc/init.d/目录下的其他用户有执行权限,且文件类型是普通文件的:

[root@xiaomazi test]# find /etc/init.d/ -type f -perm +001/etc/init.d/rpcsvcgssd/etc/init.d/sandbox/etc/init.d/ntpd.../etc/init.d/netfs/etc/init.d/autofs[root@xiaomazi test]#

5).查找/tmp/test/目录下至少有一类用户有写权限;

[root@xiaomazi test]# find ./ -perm -444././hello.txt[root@xiaomazi test]#

10.处理动作:

    处理动作:

       -print:打印在标准输出上;

       -ls:以长格式输出各文件详细信息;
       -exec COMMAND {} \; :对查找到的文件执行指定的命令;注意格式要正确:"-exec 命令 {} \;"

       注意“{}” 与 \; 之间有空格

       -ok COMMAND {} \; : 交互式的-exec;
           {}表示占位符
           find把查找到的所有文件一次性地传递给-exec所指定的命令

       find | xargs COMMAND

               在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件

           一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命

           令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢

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

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

           不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一

           批,并如此继续下去。

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

           程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,

           系统性能下降的问题,因而效率不高;

               而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所

           有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系

           统内核中相应的可调参数来确定。

应用举例:

1).查找/tmp目录下其他用户有读权限或者有写权限的文件并显示其详细信息:

[root@xiaomazi ~]# find /tmp -perm -006 -ls1048577    4 drwxrwxrwt   4 root     root         4096 Feb 26 21:35 /tmp1049215    4 drwxrwxrwt   2 root     root         4096 Feb 26 15:44 /tmp/.ICE-unix[root@xiaomazi ~]#

2).查找所有用户都有执行权限,或者其他用户都有写和执行权限:

[root@xiaomazi ~]# chmod o+x /tmp/hello.txt -->给其他用户赋予执行权限[root@xiaomazi ~]# find /tmp -perm -003 -ls1048577    4 drwxrwxrwt   4 root     root         4096 Feb 26 23:07 /tmp1049215    4 drwxrwxrwt   2 root     root         4096 Feb 26 15:44 /tmp/.ICE-unix1052213    0 -rw-rw-rwx   1 hadoop   hadoop          0 Feb 26 23:07 /tmp/hello.txt[root@xiaomazi ~]#

3).查找其他用户都有写和执行权限,并且类型为普通文件:

[root@xiaomazi ~]# find /tmp -perm -003 -type f -ls1052213    0 -rw-rw-rwx   1 hadoop   hadoop          0 Feb 26 23:07 /tmp/hello.txt[root@xiaomazi ~]#

4).查找类型为普通文件,并且将查找出来的文件的用户的写、执行权限去掉:

[root@xiaomazi ~]# find /tmp -perm -003 -type f -exec chmod o-wx {} \;[root@xiaomazi ~]# ls /tmp/hello.txt -l-rw-rw-r-- 1 hadoop hadoop 0 Feb 26 23:07 /tmp/hello.txt[root@xiaomazi ~]#

5).查找类型为普通文件,并且将查找出来的文件强行删除,注意如果有目录也会一起都被删除掉的哦:

[root@xiaomazi ~]# find /tmp -perm -003 -type f -exec rm -rf {} \;

6).查找类型为普通文件,并且将查找出来的文件的用户的写、执行权限去掉:

[root@xiaomazi tmp]# find /tmp -perm -003 -type f | xargs chmod o-wx[root@xiaomazi tmp]# ll /tmp/hello.txt-rw-rw-r-- 1 hadoop hadoop 0 Feb 26 23:07 /tmp/hello.txt[root@xiaomazi tmp]#

7).查找/tmp目录下以.doc结尾的文件并改成以.docx:

[root@localhost ~]# find /tmp -name "*.doc" -exec mv {} {}x \;[root@xiaomazi ~]# ls /tmp/test/hehe.docx  hello.txt[root@xiaomazi ~]#[root@xiaomazi ~]# ls /tmp/fstab  hello.txt  inittab  test  word.docx[root@xiaomazi ~]#

8).把/opt/test/目录下所有含有"linux"字符的文件全部替换成windows:

  命令如:find /opt/test/ -type f | awk -F":" '{print $1}' |xargs sed -i's/linux/windows/g'

9). find /a -type f -exec|-ok rm -rf { } \;

10).find /a -type f -exec|-ok rm -rf { } +;

11).find /a -type f –print0 | xargs -0 rm ;

下面是一些其它的例子:

1、查找/var/目录属主为root且属组为mail的所有文件;
# find /var/ -user root -a -group mail
2、查找/usr目录下不属于root、bin或hadoop的所用文件(两种方法);
# find /usr/ -not -user root -a -not -user bin -a -not -user hadoop
# find /usr/ -not \( -user root -o -user bin -o -user hadoop \)
3、查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件(两种方法);
# find /etc/ -mtime -7 -a -not -user root -a -not -user hadoop
# find /etc/ -mtime -7 -a -not \( -user root -o -user hadoop \)
4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;
# find / \( -nouser -o -nogroup \) -a -atime -30
5、查找/etc/目录下大于1M且类型为普通文件的所有文件;
# find /etc/ -size +1M -a -type f
6、查找/etc/目录所有用户都没有写权限的文件;
# find /etc/ -not -perm +222
   所有都没有:相反:任何一个有
   所有都有:相反:至少有一个没有
7、查找/etc/目录下至少有一类用户没有写权限;
# find /etc/ -not -perm -222
8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;
# find /etc/init.d/  -perm -113
9、查找系统上的其他用户有执行权限,且文件类型是普通文件的:
# find / -type f -perm +001

A smile is the most beautiful language!!!


j_0057.gifj_0057.gifj_0057.gif以本人的理解而写出博客,如若有错误,欢迎指出.j_0057.gifj_0057.gifj_0057.gif

                                                                       ---->小马子