find 命令特点及用法

find 命令:
                实时查找工具、通过遍历指定路径完成文件查找
                工作特点:
                    1、查找速度略慢
                    2、精确查找
                    3、实时查找
                    注意:可能只搜索用户具备读取和执行权限的目录
                语法:
                    find [option]... [查找路径][查找条件][处理动作]
                        查找路径:指定具体目标路径;默认当前
                        查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
                        处理动作:对符合条件的文件做操作,默认输出至屏幕
                    查找条件:
                        指搜索层数
                            -maxdepth level 最大搜索目录深度,指定目录为第1级
                            -mindepth level 最小搜索目录深度
                        先处理目录内的文件,在处理目录
                            -depth
                        根据文件名和inode查找:
                            -name "文件名称" :支持使用glob    *, ?, [], [^]
                            -iname "文件名称" :不区分字母大小写
                            -inum n :按inode号查找
                            -samefile name :相同inode号的文件
                            -links n :链接数为n 的文件
                            -regex "pattern " : 以pattern匹配整个文件路径,而非文件名称
                            例如:
                                ]# find /etc/ -name 'passwd' :精确查找/etc下文件名为passwd的文件;
                                ]# find /etc/ -name '*passwd*':查找/etc下文件名包含passwd的文件;
                                ]# find /etc/ -iname 'passwd*':查找/etc下文件名以passwd开头的文件;
                                ]# find /etc/ -iname 'passwd?':查找/etc下文件名以passwd开头后面跟一个字符的文件;
                                ]# find /etc/ -iname 'passwd[:alnum:]':查找/etc下文件名以passwd开头后跟字母或数字的文件;
                        根据属主、属组查找:
                            -user USERNAME:查找属主为指定用户(UID)的文件
                            -group GRPNAME: 查找属组为指定组(GID)的文件
                            -uid UserID:查找属主为指定的UID号的文件
                            -gid GroupID:查找属组为指定的GID号的文件
                            -nouser:查找没有属主的文件
                            -nogroup:查找没有属组的文件
                            例如:
                                ]# find /tmp/ -user magedu:查找/tmp目录下属主为magedu的文件;
                                ]# find /tmp/ -group linux:查找/tmp目录下属组为linux的文件;
                                ]# find /tmp/ -uid 5015:查找/tmp目录下属主为UID为5015的文件;
                                ]# find /tmp/ -gid 5015:查找/tmp目录下属组为GID为5015的文件;
                                ]# find /tmp/ -nouser -exec rm {} /;:查找没有属主的文件并删除;
                                ]# find /tmp -name '*magedu*' -a -user ubuntu:查找文件名包含magedu并且属主为ubuntu;
                                ]# find /tmp -name '*magedu*' -o -user ubuntu -o -uer magedu -ls
                                    查找文件名包含magedu或属主为ubuntu或属主为magedu的文件;
                                ]# find /tmp -name '*magedu*' -a -user ubuntu -o -uer magedu
                                    查找文件名包含magedu并且属主为ubuntu,或属主为magedu的文件;
                                ]# find /tmp -name '*magedu*' -o -user ubuntu -not -user magedu |xargs ls -l;
                                    查找文件名包含magedu或属主为ubuntu,且属主不是magedu的文件;
                                ]# find /tmp -name '*magedu*' -not -user magedu |xargs ls -l;
                                    查找文件名包含magedu并且属主不是magedu的文件;
                                ]# find /tmp -name '*magedu*' -not -user magedu -not -user ubuntu
                                    查找文件名包含magedu并且属主不是magedu也不是ubuntu的文件;
                                ]# find /tmp -name '*magedu*' -not \( -user magedu -o -not -user ubuntu \)
                                        查找条件同上;
                        根据文件类型查找
                             -type TYPE
                                f: 普通文件
                                d: 目录文件
                                l: 符号链接文件
                                s:套接字文件
                                b: 块设备文件
                                c: 字符设备文件
                                p: 管道文件
                            空文件或目录
                                -empty
                                    find /app -type d -empty
                            例如:
                                ]# find /etc/ -type f:查找/etc/目录下普通文件;
                                ]# find /etc/ -type d -ls:查找/etc/目录下目录文件;

                        查找条件:
                            组合条件:
                                与:-a
                                或:-o
                                非:-not !
                            德·摩根定律:
                                (非 A) 或 (非 B) = 非(A 且 B) 
                                (非 A) 且 (非 B) = 非(A 或 B) 
                            示例:
                                !A -a !B = !(A -o B)
                                !A -o !B = !(A -a B)
                            例如:
                                ]# find /tmp -nouser -type f -ls:查找/etc/目录下没有属主同时类型为普通文件;
                                ]# find /tmp -nouser -a -type f -ls:同上;
                                ]# find /tmp -nouser -o -type f -ls:查找/etc/目录下没有属主或类型为普通文件;
                                ]# find /tmp -not -type f -ls:查找/etc/目录下不是普通文件的文件;
                        find 示例:
                            find -name snow.png
                            find -iname snow.png
                            find / -name “*.txt”
                            find /var –name “*log*”
                            find -user joe -group joe
                            find -user joe -not -group joe
                            find -user joe -o -user jane
                            find -not \( -user joe -o -user jane \)
                            find / -user joe -o -uid 500

                            找出/tmp目录下,属主不是root,且文件名不以f开头的文件
                                find /tmp \( -not -user root -a -not -name 'f*' \) -ls
                                find /tmp -not \( -user root -o -name 'f*' \) –ls
                            排除目录
                            示例:
                                查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
                                 find /etc -path ‘/etc/sane.d’ -a –prune -o -name “*.conf” 
                                查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
                                 find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -
                                name "*.conf
                        根据文件大小来查找:
                            -size [+|-]#UNIT
                                常用单位:k, M, G,c(byte)
                            #UNIT: (#-1, #]
                                如:6k 表示(5k,6k]
                            -#UNIT:[0,#-1]
                                如:-6k 表示[0,5k]
                            +#UNIT:(#,∞)
                                如:+6k 表示(6k,∞)
                            例如:
                                ]# find /etc/ -size 2K -ls:查找/etc/目录下小于1k,大于等于2k的文件;
                                ]# find /etc/ -size -2K -ls:查找/etc/目录下小于2k的文件;
                                ]# find /etc/ -size +2K -ls:查找/etc/目录下大于2k的文件;
                                ]# find /etc/ -size +3K -size -10K -ls:表示查找大于3K小于10K的文件;
                                ]# find /etc/ -size +1M -a -size -8M -ls:表o示查找大于1M小于8M的文件;
                                ]# find 

                        根据时间查找:
                            以“天”为单位:
                                -atime [+|-]#:根据访问时间查找;
                                -mtime [+|-]#:根据修改时间查找;
                                -ctime [+|-]#:根据改动时间查找;
                                    [+|-]#:默认以“天”为单位,“天”是24小时查询的;
                                    以前2天为例,当前日期为2018-12-24时间为10:00整,说明;
                                        #:[#,#+1),查找指定时间;
                                            如例:2表示:查找前2天当天的那一整天的时间;
                                            即从2018-12-24,10:00到2018-12-25,10:00之间的24小时;

                                        +#:[#+1,oo],查找指定时间之前的文件;
                                            如例:+2表示:2018-12-26,10:00之前;

                                        -#:(-oo,#),查找最近#天的文件,即#天内;
                                            例如:-2表示:从2018-12-24,10:00到现在;
                                例如:
                                    ]# find /etc/ -ctime +2 -ls:查找2天以前改变的的文件;
                                    ]# find /etc/ -ctime -2 -ls:查找2天之内改变的文件;
                                    ]# find /etc/ -ctime 3 -ls:查找前第3天内改变的文件;

                            以“分钟”为单位:
                                -amin [+|-]#:根据访问的分钟查找;
                                -mmin [+|-]#:根据修改的分钟查找;
                                -cmin [+|-]#:根据改动的分钟查找;
                                    [+|-]#:概念同以“天”为单位;

                                例如:
                                    ]# find /etc/ -cmin -60 -ls:查找60分钟以内改变的文件;
                                    ]# find /etc/ -ctime 50 -ls:查找第50分钟之内的1分钟改变的文件;
                                    ]# find /etc/ -ctime +50 -ls:查找50分钟之前改变的文件;                    

                        注意:find中对于时间的推算均为:
                            1、+号表示到...为止;-号表示从...开始;一个时间单位内的不带符号;
                            2、数字代表往前偏移量;
                            3、0表示当前往后的一个时间单位为基准;-0就是下线单位;+0就是上限单位;


                        根据权限查找:
                            -perm [/|-]MODE
                                MODE: 精确权限匹配
                                /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 
                            从centos7开始淘汰
                                -MODE:每一类对象都必须同时拥有指定权限,与关系
                                 0 表示不关注
                                 
                            find -perm 755 会匹配权限模式恰好是755的文件
                            只要当任意人有写权限时,find -perm +222就会匹配
                            只有当每个人都有写权限时,find -perm -222才会匹配
                            只有当其它人(other)有写权限时,find -perm -002才会匹配
                            例如:
                                ]# find /tmp/ -perm 104 -ls
                                    查找权限为104的文件;
                                ]# find /tmp/ -perm /104 -ls
                                    查找任何一类用户的任何一位权限有执行或或读权限的文件;(或关系)
                                ]# find /tmp/ -perm /666 -ls
                                    查找u,g,o任何一类用户(至少有一类)中有读或写权限的文件;
                                ]# find /tmp/ -perm /222 -ls
                                    查找至少有一类用户有写权限的文件;
                                ]# find /tmp/ -perm /111 -ls
                                    查找至少有一类用户有执行的文件;
                                ]# find /tmp/ -perm /001 -ls
                                    查找其它用户有执行权限的文件;
                                ]# find /tmp/ -perm /002 -ls
                                    查找其它用户有写权限的文件;
                                ]# find /tmp/ -perm /022 -ls
                                    查找属组或其它用户,有写权限的文件;

                        查找指定目录层级:
                            -maxdepth #
                            例如:
                                ]# find /etc/ -maxdepth 3 -ok cp {} /root \;
                                    查找/etc下的3级目录的文件,执行cp命令到/root目录下;
                                ]# find /etc/ -maxdepth 3 |xargs ls -lh;
                                ]# find /etc/ -maxdepth 3 |grep "yum" -R;
                                ]# find /etc/ -maxdepth 3 |xargs echo "" > /tmp/etc.file.list;
                                    查找的结果传递给echo命令,后重定向到/tmp/etc.file.list;

                        处理动作:
                            -print:将查找到的文件路径输出至标准输出;,默认处理动作;
                            -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
                            -delete:删除查找到的文件;(慎用)
                            -fls /path/to/somefile:把查找到的所有文件的长格式信息保存到指定文件中;
                            -ok COMMAND {} \;:对查找到的每个文件都执行由COMMAND表示的命令,执行之前都会交互式要求用户确认;
                            -exec COMMAND {} \;:对查找到的每个文件都执行由COMMAND表示的命令,不交互;

                            注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
                                但是有些(很多)命令不能接受过长的参数,此时命令执行会失败;可使用另一种方式可归避此问题;
                                    find | xargs COMMAND

                            课外作业:学习xargs命令的用法;


                            例如:
                                ]# find /etc/ -nouser -a -nogroupp -ok chown root:root {} \;
                                    交互式,查找没有属主属组的文件后,改为属主属主为root;
                                ]# find /etc/ -perm /002 -exec mv {} {}.danger \;
                                    不交互,查找其它用户有写权限的文件后,改文件名为后缀为.danger;
                                ]# find /etc/init.d/ -perm -111 -fls /tmp/file
                                ]# find /etc/init.d/ -perm -111 -ok file {} \;:交互式执行file命令;
                                ]# find /etc/init.d/ -perm -111 -exec file {} \;:不交互直接执行file命令;
                                ]# find /tmp/ -name '*linux*' -perm 755 -ok mv {} /root \;:把查询结果移动到/root目录下;
                        练习:
                            1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
                            ]# find /var -usre root -a -group mail -ls

                            2、查找/usr目录下不属于root、bin或hadoop的所有文件或目录;
                            ]# find /usr -not -user root -not -user bin -not -user hadoop -ls:与-a可省略,为默认逻辑关系;
                            ]# find /usr -not \( -user root -o -user bin -o -user hadoop \)

                            3、查找/etc目录下最近一周内其内容修改过,同时属主不为root,也不是hadoop的文件或目录;
                            ]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \)
                            ]# find /etc -mtime -7 -a -not -user root -not -user hadoop:与-a可省略,为默认逻辑关系;

                            4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录;
                            ]# find / -nouser -o -nogroup -atime -7:与-a可省略,为默认逻辑关系;

                            5、查找/etc目录下大于1M且类型为普通文件的所有文件;
                            ]# find /etc -type f -size +1M

                            6、查找/etc目录下所有用户都没有写权限的文件;
                            ]# find /etc -not -perm /222
                                三类用户(或)没有写权限再取反即为三类用户都没有写权限;

                            7、查找/etc目录下至少有一类用户没有执行权限的文件;
                            ]# find /etc -not -perm -111:三类用户都(与)没有执行权限再取反即为三类用户或没有执行权限;

                            8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件;
                            ]# find /etc/init.d -perm -113

                        生产环境find用法:

                            用脚本实现(shell),每天晚上4点半(crontab),找出/data/log/nginx下的该格式“nginx-test-XXX-XX.log”的测试日志文件,如果该日志大于2M,则将其删除(find+exec),删除后,把删除的文件名称记录到/tmp目录下rm.log文件中(echo | fls)。

                            find /data/log/nginx -name 'nginx_text*.log' -size +2M -exec fls /tmp/rm.log \;
                            cat /tmp/rm.log
                            用crontab制作计划任务
                            1、先写日志;
                            2、再删除;

你可能感兴趣的:(个人)