暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux常用命令之一 find命令

程序员小星星 2021-08-08
605
使用linux经常会有需要在linux服务器上面查找符合指定条件的文件,比如在某个目录下面查找指定名称的文件等。linux给我们提供了一个非常好用的find命令,本文将根据自己工作当中的使用实践,对find命令做个总结。

一、find命令基本语法

find命令用来在指定目录下面查找文件,是linux默认自带的文件搜索工具,功能相当丰富强大,使用语法如下:

    usage: 
    find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
    find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
    其中[-H | -L | -P]称为前置参数,相对比较少用到,简单了解下即可,并不影响后续命令的使用:
    • [-H] 除命令中指定的软连接外,不搜寻路径中软连接下的结果

    • [-L] 搜寻结果包括路径中的软连接下的结果

    • [-P] 不搜寻路径中软连接下的结果,默认使用此参数

    所以如果不用到这些个前置参数,那么使用语法其实可以简化为:

      find path ... [expression]
      • path:find命令所查找的目录路径

      • expression:expression可以分为“-options [-print -exec -ok ...]”


          其中-options [-print -exec -ok ...]解释如下:

      • -options,指定相关选项,常用选项下文在介绍

      • -print,将匹配的文件输出到标准输出

      • -exec,将find命令的匹配结果传给exec后接的命令。相应命令的形式为“command {} \;”,下文会有示例

      • -ok,和-exec的作用相同,区别就是在执行每一个命令之前,都会给出提示,让用户来确定是否执行


      二、find命令的常用选项及示例

      1、按照文件名称查找,使用-name 指定查找的文件名称,支持正则匹配

      1.1 查找当前目录下所有的java源文件

        find . -name "*.java"

        1.2 查找/temp下所有以大写字母开头的log文件

          find temp -name "[A-Z]*.log"

          1.3 在当前目录下查找不是 a 开头的 log 文件

          -prune 表示把前面命令所匹配到的路径排除

          -o表示或

          -a 表示与

            find . -name "a*" -prune -o -name "*.log"

            1.4 在当前目录除 git 子目录外查找java源文件

              find . -path "./git" -prune -o -name "*.java"


              2、按照文件类型查找

              find命令用-type选项指定文件类型:
              • f - 普通文件
              • d - 目录
              • b - 块设备文件
              • c - 字符设备文件
              • p - 管道文件
              • l - 符号链接文件

              2.1 查找当前目录下的普通文件且以log结尾

                find . -type f -name "*.log"

                2.2 查找当前目录下的软连接文件

                  find . -type l 


                  3、使用-permz指定权限查找

                  3.1 查找当前目录权限为 644 的文件

                    find . -type f -perm 644

                    3.2 查找/etc/目录下权限为111的文件

                      find /etc -perm -111 


                      4. 根据文件属主和属组进行查找

                      4.1  查找当前目录下面用户属主为abobo的文件,-user指定用户

                        find . -user aboboo

                        4.2 查找当前目前下面属组为aboboo的文件,-group指定用户组

                          find . -group aboboo

                          4.3 查找当前目录无有效用户属主的文件

                            find . -nouser 

                            4.4 查找当前目录无有效所属组的文件

                              find . –nogroup 


                              5. 使用-size指定文件大小进行查找

                              5.1 查找当前目录下小于20k的文件

                                find . -size -20k -type f

                                5.2 查找当前目录下大于500M的文件

                                  find . -size +500M -type f


                                  6. 按照时间进行查找

                                  6.1 查找3天内被修改过的文件,-mtime 表示内容修改时间

                                    find . -mtime -3 -type f

                                    6.2 查找一天内被访问的文件,-atime 表示访问时间

                                      find . -atime -1 -type f

                                      6.3 查找一天内状态被改变的文件,-ctime 表示元数据被变化时间

                                        find . -ctime -1 -type f

                                        6.4 查找比aboboo.txt更新的文件

                                          find . -newer "aboboo.txt" -type f


                                          7. 查找后执行指定动作

                                          7.1  以 ls 长文件的格式形式输出查找到的txt结尾的文件

                                            find . -name "*.txt" -ls

                                            7.2 删除查找到的文件

                                              find . -size +500M -delete

                                              7.3 删除0字节的空文件

                                                find -type f -size 0 -exec rm -rf {} \;


                                                三、find命令与xargs命令

                                                在使用-exec选项处理匹配到的文件时,其实有一个限制,因为有些linux命令是有命令长度限制的,所以如果find的匹配结果太多,那么传给exec的制定命令去执行时,就会报错“参数列太长”或“参数列溢出”。这种情况就可以使用xargs很好的解决这个限制。

                                                xargs能够捕获一个命令的输出,然后传递给另外一个命令。可以组合多个命令一起使用,一般和管道一起使用。关于这个命令的详细介绍,后面也会总结一篇文章来详细介绍,这里给出几个常用的使用示例。

                                                1.1 用grep命令在find匹配文件中搜索aboboo这个词
                                                  find . -type f -name "*.log" | xargs grep "aboboo" 
                                                  1.2 删除7天之前的文件
                                                    find . -mtime +7 |xargs rm -fr



                                                    小结:

                                                    find命令就暂时介绍到这里,当然可能不够全面,文中示例也不一定都正确无误,所以仅供参考哦。后续本公众号将继续发布Linux命令相关的介绍文章,希望一起交流学习。
                                                    文章转载自程序员小星星,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                    评论