Linux学习之路4-强大的find命令


强大的find命令


语法:

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

         查找路径:默认为当前路径;

         查找条件:指定的查找标准,可以根据文件名、大小、属主属组、类型等进行;默认为找出指定路径下的所有文件

        

根据文件名进行查找

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

                 *, ?, []

     -iname "文件名称":不区分字符大小写,支持使用glob;

 

     -regex"PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;

 

根据属主、属组查找

     -user USERNAME: 查找属主为指定用户的文件;

     -group GROUPNAME:

     -uid UserID: 查找文件的属主指定uid的文件;

     -gid GroupID:

     -nouser: 查找没有属主的文件;

     -nogroup:查找没有属组的文件;

     

        find /-nouser -a -nogroup 查找没有属主、属组的文件

 

 根据文件类型进行查找

     -type TYPE

         f: 普通文件

         d: 目录

         l: 符号链接

         b: 块设备

         c: 字符设备

         p: 命名管道

         s: 套接字

        

            find / -userdx -type f 查找用户名为dx文件类型为普通的文件

 

  组合查找条件:

     与条件:-a

     或条件:-o

     非条件:-not, !

 

     !A -o !B = !(A -a B)

     !A -a !B = !(A -o B)

     

        find / -userdx -type f 默认为与条件

        find / -user dx -o -type l查找用户名为dx或文件类型为符号链接的文件

        find / ! -user dx 查找用户名不是dx的文件

 

  根据文件大小进行查找

      -size [+|-]#unit #为一个整数

      1. #unit    例如-size3k  要注意!这里含义是一个范围{3-1,3}

                                 2K至3K

      2. +#unit   例如-size +3k 这个好理解,意思是3K以上

      3. -#unit   等于{0,#-1} 例如-size -3k 这里又要注意了!又是一个范围了,小于{3-1}K,即小于2K

       

        根据时间进行查找:

            这里又分以天(24小时)为单位:

                -atime  访问时间

                -mtime  修改时间

                -ctime  改变时间

       这里时间的条件使用也很特别!例如:

           -mtime 4 表示查找5天前4天后被修改的,大于等于4小于5

           -mtime +4 表示5天后被修改的,大于等于5

           -mtime -4 表示4天以内被修改的,小于4

 

       以分钟为单位:

           -amin 访问

           -mmin 修改

           -cmin  改变

                            

    根据权限:

        -perm [/|-]MODE

        MODE: 精确权限匹配

        /MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件;

        -MODE:为每一类对象指定的每一位权限都必须同时存在方为符合条件;隐含与条件;每一类用户的权限都包含对其指定的所有权限。即至少有指定的权限!

        

            #find  /tmp  -perm 755   //查找在/tmp目录下权限是755的文件

            #find  /tmp  -perm +222  //表示只要有一类用户(属主,属组,其他)的匹配写权限就行

            #find  /tmp  -perm -222  //表示必须所有类别用户都满足有写权限

 

     处理动作:

         -print: 默认处理动作,默认为输出至屏幕

         -ls:类似于对查找到的每个文件做"ls -l"的操作;

         -delete: 删除查找到的文件;

         -fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;

         -ok COMMAND {} \;对每个文件执行指定的命令之前需要用户事先确认;

         -exec COMMAND {} \;无需用户确认;

 

      find 技巧:

 

          时间查找技巧

              用man说明:-mtime  n       Files data was last modified n*24 hours ago.

              所以find -mtime 4 是找到所有在距现在96小时之内被修改过的文件或目录。

              find -mtime 4 是找到所有5天前4天后被更改的档案文件,

              find -mtime -4 是4天内被改的档案,

              find -mtime +4 是4+1天,5天后被改的档案。

 

                 其他技巧:至少一类用户没有的反义是所有用户都有,再取反就ok了,正面难写时就取反,再在个反就得到了

           例如:练习题16(至少有一类用户,所以用-,没有执行权限,反过来理解就是有执行权限111,然后用!取反就得到结果了)

           查找/etc目录下至少有一类用户没有执行权限的文件;

               方法一:find /etc  \( ! -perm /001 -o ! -perm /010 -o ! -perm/100 \)

               方法二:find /etc ! -perm -111

 

            find �Cok 用法,留意这里没有-exec

                find /root/ -name "del.txt" -ok -rm {} \;

 

            文件大小查找技巧

 

                        例如:一个文件5556字节,可以这样写

                        find /root -size -5557c -size+5555c -exec ls -ld {} \;

                        (即查找大于5555字节小于5557字节的文件,以上查找的是/root 目录)

                         

                        查找 小于500K,大于50K的文件

                        find /root -size -500K -size+50K -exec ls -ld {} \;

                         

                        size默认单位是b,而它代表的是512字节,所以2表示1K,1M则是2048,如果不想自己转换,可以使用其他单位,如c、K、M等

                        find . -empty 查找当前目录大小为0的文件或空目录

 

            正则匹配实例与技巧

                        find path -regex"xxx"

                        find path -iregex"xxx"

                        这两条命令都是运用base-regexp对文件路径进行匹配,iregex忽略大小写。

                        但是给出的正则表达式必须要匹配完整的文件路径

                           比如:find /-regex "find" 这样子是找不到/usr/bin/find的,要像这样find / -regex ".*find"或者更精确一点find/ -regex ".*/find"

                        如果要使用扩展的正则表达式,对于BSD系的find可以在路径名前加一个"-E"选项

                        GNU的find支持多种风格的正则表达式,用-regextype 指定所使用的正则表达式类型,可选的有emacs(默认),posix-awk,posix-basic,posix-egrep,posix-extended,喜欢了grep -E,所以我就用posix-egrep了

                        find / -regextype "posix-egrep" -regex ".*/find"

                        find . -exec chown dx:root {}\;改变当前目录下所有文件的权限

                        find . -cmin -10 查找当前目录下10分钟内被修改过的文件,+10即是10分钟之前


你可能感兴趣的:(linux,find)