find 命令

2019-04-28  本文已影响0人  赛亚人之神
工作特点:
    查找速度略慢:
    精确查找:
    实时查找:

语法:
    find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

    可以总结为如下命令:

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

        查找路径:指定具体目标路径,默认为当前目录
        查找条件:指定的查找标准,可以是文件名、大小、类型、权限等标准进行,默认为找出指定路径下的所有文件
        处理动作:对符合条件的文件做什么操作,默认输出至屏幕


        1. 查找条件
            1)根据文件名查找
                -name "文件名称",支持使用 glob
                    *, ?, [], [^]

                -iname "文件名称",不区分字母大小写
                -regex "PATTERN",以 PATTERN 匹配整个文件路径字符串,而不仅仅是文件名称

            2)根据属主、属组查找:
                -user Username: 查找属主为指定用户的文件
                -group Groupname: 查找属组为指定组的文件

                    例如: 
                        cp /etc/fstab /tmp; chown root:grandkai /tmp/fstab
                        find /tmp -user root -ls
                        find /tmp -group root -ls

                    注意: 如果用户被删除,那么文件的属主会被显示为 UID,而不是用户名,此时可以使用 -uid, -gid 进行查找

                -uid UserID:    查找属主为指定UID号的文件
                -gid GroupID:   查找属组为指定GID号的文件

                -nouser:    查找没有属主的文件
                -nogroup:   查找没有属组的文件
                    通常用于用户,用户组被删除的情况,以确保系统安全

            3)根据文件类型查找:
                -type TYPE:
                    b:块设备文件
                    c:字符设备文件
                    d:目录文件
                    f:普通文件
                    l:符号链接文件
                    p:管道文件
                    s:套接字文件

            4)组合条件:
                与:-a
                或:-o
                非:!, -not

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

                例子:取出 /tmp 目录下,属主不是 root,且文件名不是 fstab 的文件
                    1. find /tmp \( -not -user root -a -not -name fstab \) -ls
                    2. find /tmp -not \( -user root -o -name fstab \) -ls

                    注意:如果不加()括起来,那么 ls 命令显示出来的可能不是正确的结果,
                         假如 /tmp 下存在 fstab 属主为1001,数组为 1003,那么下面的命令显示不出来正确的结果

                         错误:find /tmp -uid 1001 -o -gid 1003 -ls
                         正确:find /tmp \( -uid 1001 -o -gid 1003 \) -ls

            5)根据文件大小来查找:
                -size [+|-]#UNIT
                    常用单位:k,M,G

                    #UNIT:(#-1,#]
                    -#UNIT: [0,#-1]
                    +#UNIT: (#,∞)

                例子:
                    find /var -size 3k -exec ls -lh {} \;

                    上面的参数说明:
                        查找 (2k, 3k] 的文件
                        如果是 -3k,则查找 [0k,2k] 的文件
                        如果是 +3k,则查找 (3k,,∞) 的文件


            6)根据时间戳来查找:
                以“天”为单位:
                    -atime [+|-]#
                        #:      [#,#+1)     第3天修改的文件(3天前但不到4天)
                        +#:     [#+1,∞]     4天前修改的文件
                        -#:     [0, #)      3天内修改的文件
                    -mtime
                    -ctime

                以“分钟”为单位:
                    -amin
                    -mmin
                    -cmin

            7)根据权限来查找:
                -perm [+|-]MODE
                    MODE: 精确权限匹配
                    +MODE: 任何一类(u, g, o)对象的权限中只要能一位匹配即可     - 或关系
                    -MODE: 每一类对象都必须同时拥有为其指定的权限标准            - 与关系
                        -666
                            -766 符合
                            -760 不符合

        2. 处理动作:
            -print:                     default,显示至屏幕
            -ls:                        类似对查找到的文件执行“ls -l” 命令
            -delete:                    删除查找到的文件
            -fls /path/to/somefile      查找到的所有文件的长格式信息保存至指定文件中
            -ok COMMAND {} \;           对查找到每个文件执行由 COMMAND 指定的命令
                对于每个文件执行命令之前,都会交互式要求用户确认

            -exec COMMAND {} \;         对查找到每个文件执行由 COMMAND 指定的命令

                {}: 表示引用查找到的文件名自身

            注意: find传递查找到的文件至后面指定的命令时,查找到的所有符合条件的文件一次性传递给后面的命令;
                有些命令不能接口过多参数,此时命令执行可能会失败,另一种方式可规避此问题

                find | xagrs COMMAND


            举例:
                1. 将 /tmp 目录下没有属主的文件的属主改为 root
                    find /tmp -nouser -exec chown root {} \;

                2. 将 /tmp 目录下没有属组的文件的属组改为 root
                    find /tmp -nogroup -ok chown :root {} \;

                3. 查找 /tmp 下最近5分钟修改过的文件,并将其重新命名为 .new 文件
                    find /tmp/ -cmin -5 -exec cp {} {}.new \;

    练习:
        1. 查找 /var 目录下属主为 root,且属组为 mail 的所有文件或目录
            find /var/ -user root -group mail

            扩展 - 显示文件目录或权限
            find /var/ -user root -group mail -exec ls -l {} \;

        2. 查找 /var 目录下不属于 root、bin 或 hadoop 的所有文件或目录
            find /var/ -not \( -name root -o -name bin -o -name hadoop \)

        3. 查找 /etc 目录下最近一周内其内容修改过,同时属主不为 root,也不属于 hadoop 的文件或目录
            find /etc/ \( -ctime -7 -a -user root -a -user hadoop \)

        4. 查找当前系统上没有属主或属组,且最近一周内层位访问过的文件或目录
            find /etc/ \( -not \( -user root -o -user mysql \) -a -ctime -7 \) -ls

        5. 查找 /etc 目录下大于 1M 且类型为普通文件的所有文件或目录
            find /etc/ -size +1M  -type f -exec ls -lh {} \;

        6. 查找 /etc 目录下所有用户都没有写权限的文件或目录
            600, 660 666, 006, 066

            find /var/ -not \( -perm -666  -o -perm -600 -o -perm -660 -o -perm -006 -o -perm -066 \) -exec ls -l {} \;



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

        8. 查找 /etc/init.d 目录下,所有用户都有执行权限,且其它用户有写权限的文件或目录
上一篇下一篇

猜你喜欢

热点阅读