HU YUAN 的博客

导航

Linux find 命令详解

简介:

    在 Linux 中 find 是一个强大的文件查找工具, 可以用于查找系统或指定目录的指定文件, find 支持正则表达式和统配符进行匹配

 

find 命令格式:

# 使用格式
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

格式说明:
    path         find 查找的路径, / 表示在当前系统中查找
    expression   表达式, 默认为 print(将 find 的匹配结果输出到屏幕)

 

find 参数:

OPTIONS(选项):
    和符号链接相关的选项:
        -P      不跟踪符号链接(默认行为)
        -L      当 find 检查或打印有关文件的信息时, 所使用的信息应取自链接指向的文件的属性, 而不是链接本身
        -H      和 -L 参数刚好相反,  当 find 检查或打印有关文件的信息时, 所使用的信息应取自符号链接的属性
    
        示例:
            # 建立测试环境
            ln -s /etc/ /tmp/

            # 查找 etc/fstab, 默认 find 命令不会跟踪符号链接, 所以 find 不会搜索 /tmp/etc/ 所指向的 /etc/, 这时 find 不会得到的任何内容  
            find /tmp/ -name 'fstab'

            # 查找 etc/fstab, 使用 -L 选项, find 会搜索 /tmp/etc/ 所指向的 /etc/ 和其子目录, 这时可以查找到 fstab
            find -L /tmp/ -name 'fstab'

            # -H 使用符号链接本身的属性, 所以 find 将 /tmp/etc/ 当成一个文件, 这时 find 不会得到的任何内容  
            find -H /tmp/ -name 'fstab'
            
        注意:
            1、-P -L -H 可以同时出现, 但是只有处于命令行最后的那个参数生效
            2、当 -L 或 -H 生效时, 任何作为 -newer 参数列出的符号链接将被取消引用, 并且时间戳将从符号链接指向的文件中取出(-newerXY、-anewer、-cnewer 和 -newer 的行为相同)

    调试和优化:
        -D      调试模式
        -O      指定优化级别(默认为0)
            0、1        级别 0 和 级别 1 相同, 这是默认的优化级别, 对表达式进行重新排序, 以便基于 -name 和 -regex 的查找
            2           对于基于 -type 或者 -xtype 的查找, 先从 inode 中读取文件类型
            3           启用快速查找


EXPRESSIONS(表达式):
    OPTIONS(选项):
        -d、-depth              在查找文件时, 首先查找当前目录中的文件, 然后再在其子目录中查找
        -maxdepth n             find 查找目录的最大深度
        -mindepth n             find 从指定的目录的第几层深度开始查找
        -mount                  查找文件时不跨越文件系统的 mount 点
        -follow                 和 -L 参数类似
        -regextype              指定后面所使用的正则表达式语法, 默认为 emacs
            posix-awk               类 awk 的正则表达式语法  
            posix-basic             基本正则表达式
            posix-egrep             不使用正则表达式
            posix-extended          扩展正则表达式



    TESTS(测试, 检查文件是否符合表达式):
        可以将数字参数指定为:
            +n      大于n
            -n      小于n
            n       等于n
            
        常用参数:
            -anewer file        将指定目录下的所有文件和 file 对比, 输出读取或写入时间在 file 读取或写入之后的文件, 该选项会的链接文件进行跟踪
            -newer  file        和 anewer 类似, 将指定目录下的所有文件和 file 对比, 输出修改时间在 file 修改之后的文件, 该选项会的链接文件进行跟踪         
            -empty              查找空文件或目录
            -fstype type        查找指定文件系统上的文件     
            -gid n              根据文件 gid 查找
            -uid                根据文件 uid 查找
            -user               根据属主查找
            -group gname        根据文件属组查找
            -name               根据文件名进行查找
            -iname              和 -name 类似, 但是 -iname 不区分大小写
            -regex              使用正则表达式进行查找
            -iregex             和 -regex 类似, 但是 -iregex 不区分大小写
            -nogroup            查找没有属组的文件(文件的属组列为数字)
            -nouser             查找没有属主的文件(文件的属主列为数字)
            -perm               根据文件权限进行查找
            -readable           查找可读文件
            -writable           查找可写文件
            -path               通常和 -prune 一起使用, 表示忽略某个目录
            -prune              忽略 -path 指定的目录, 不能和 -delete、-depth 参数一起使用
            -size n[cwbkMG]     根据文件大小进行查找
                b    512 字节(默认)
                c    1 字节
                w    2 个字节的单词
                k    1 k
                M    1 m
                G    1 g

            -type c
                b      块设备
                c      字符设备
                d      目录
                p      命名管道
                f      文件
                l      链接文件
                s      socket 文件
            
            和时间查找相关:
                time 类型介绍:
                    mtime(Change): 当文件内容发送改变时更新 mtime
                    ctime(Modify): 当文件权限或属性发生改变时更新 ctime(内容更新时也会更新该值, 和 mtime 唯一区别在于, 当权限或属性发生改变时 mtime 不会改变)
                    atime(Access): 文件被访问时发生改变
                    relatime: 如果一个文件不停的被访问每一次都更新 atime 的话将会大大的增加磁盘 IO 的压力, 所有 Linux kernel 2.6 之后出现了 relatime 属性
                    使用这个属性之后只有当 atime 的时间落后 mtime 或者 ctime 之后 atime 才会更新, 在 centos 中想要使用 relatime 必须使用 mount -o relatime 或者在 /etc/fstab 中添加 relatime 参数

                    在 Linux 中使用 stat [file|dir] 可以看见这个几个值的具体信息

                -ctime n            文件状态最后一次修改是在 n 天之前
                -atime n            文件最后一次访问是在 n 天之前
                -mtime n            文件最后一次修改是在 n 天之前
                -cmin n             文件状态最后一次修改是在 n 分钟之前
                -amin n             文件最后一次访问是在 n 分钟之前
                -mmin n             文件最后一次修改是在 n 分钟之前
                

    ACTIONS(对符合表达式的结果进行操作):
        -delete                 删除查找到的文件或目录(谨用)
        -exec                   将查找的文件或目录传递给 exec 后面的 shell 命令作为参数
        -ls                     将查找到的文件或目录传递给 ls -l 命令作为该命令的参数
        -ok                     类似于 -exec , 但是在执行命令之前会询问用户是否执行
        -print                  默认动作, 将查找结果输出的屏幕
        -printf format          类似于 -print, 但是可以自定义输出格式

  

常用示例:

# 查找系统中的所有以 .log 结尾的文件
find / -name "*.log"

# 查找系统中权限为 777 的文件或目录, 并使用 ls -l 查看其详细信息
find / -perm 777 -ls

# 查找系统中属主和属组为 postfix 的文件或目录
find / -user postfix -group postfix

# 删除 /var/log/ 空文件和目录
find /var/log/ -empty -delete

# 使用"扩展正则表达式"查找系统中的所有以.so和.log结尾的文件
find / -regextype posix-extended -regex ".*\.log$|.*\.so$"

# 查看 /etc/ 最近三天修改过的文件
find /etc/ -mtime -3

# 查看 /etc/ 30天前修改过的文件
find /etc/ -mtime +30

# 查找 /var/log/ 所有以 .log 结尾的文件, 通过 chmod 命令将其权限改为 666
find /var/log/ -name "*.log" -exec chmod 666 {} \;

# 查看权限是否已经更改
find /var/log/ -name "*.log" -ls

# 查找系统文件大小大于 10M 的所有文件
find / -type f -size +10M

# 查找系统文件大小小于 1k 的所有文件
find / -type f -size -1k

# 系统中没有属组和属主的文件或目录
find / -nouser -nogroup

# 查找系统中的 .log 文件, 查询深度不超过 3 层
find / -maxdepth 3 -name "*.log"

# 查找系统中的 .log 文件, 查询深度从第 4 层开始
find / -mindepth 4 -name "*.log"

  

 

posted on 2018-12-18 12:03  HuYuanBlog  阅读(3196)  评论(1编辑  收藏