linux find文件查找命令find,locate与grep文件内容查找命令

本文介绍了Linux下的三个文件查找命令。find可对整个系统遍历查找,能按文件名、特征等查找,还可执行操作;locate遍历其生成的数据库,查找速度快但只能模糊匹配;grep根据文件内容查找,按给定模式匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下查找文件的命令有三个;locate 和 find,grep

 一 find

find在不指定查找目录的情况下是对整个系统进行遍历查找

  使用格式 :  

find  [指定查找目录]  [查找规则]  [查找完后执行的action]

$ find [path] [option] [expression]

  [指定查找目录]例如:

这里要注意的是目录之间要用空格分开

1.

find /root/data/springboot/ -mtime +20 -name *.log | xargs ls -ltrh

find /root/data/springboot -mtime +20 -name *.log | xargs rm -f

2.

find /root/data/springboot -mtime +20 -name *.log -delete

find /root/data/springboot -mtime +20 -name *.log -print  

1.按照文件名查找

    (1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找
    (2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf
    (3)find /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件
    (4)find . -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件

2.按照文件特征查找     

    (1)find / -amin -10   # 查找在系统中最后10分钟访问的文件(access time)
    (2)find / -atime -2   # 查找在系统中最后48小时访问的文件
    (3)find / -empty   # 查找在系统中为空的文件或者文件夹
    (4)find / -group cat   # 查找在系统中属于 group为cat的文件
    (5)find / -mmin -5   # 查找在系统中最后5分钟里修改过的文件(modify time)
    (6)find / -mtime -1   #查找在系统中最后24小时里修改过的文件
    (7)find / -user fred   #查找在系统中属于fred这个用户的文件
    (8)find / -size +10000c  #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
    (9)find / -size -1000k   #查找出小于1000KB的文件

3.使用混合查找方式查找文件

    参数有: !,-and(-a),-or(-o)。

    (1)find /tmp -size +10000c -and -mtime +2   #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件
         (2)find / -user fred -or -user george   #在/目录下查找用户是fred或者george的文件文件
         (3)find /tmp ! -user panda  #在/tmp目录中查找所有不属于panda用户的文件

1 详解

(1)根据文件名查找

#  -name       //根据文件名查找(精确查找)

#  -iname       //根据文件名查找,但是不区分大小写 

这里另外介绍下文件名通配的知识

*表示  通配任意的字符

 

          

 ?表示  通配任意的单个字符

         

[ ] 表示 通配括号里面的任意一个字符

(2)根据文件所属用户和组来查找文件

           #  -user         //根据属主来查找文件

           #  -group        //根据属组来查找文件

 

(3),根据uid 和 gid来查找用户

           #find  /tmp  -uid  500  //查找uid是500 的文件

           #find  /tmp  -gid  1000 // 查找gid是1000的文件

 

(4)-a  and  -o  and  –not的使用

           # -a 连接两个不同的条件(两个条件必须同时满足)

 

# -o 连接两个不同的条件(两个条件满足其一即可)

# -not 对条件取反的

  

(5)根据文件时间戳的相关属性来查找文件

          我们可以使用stat命令来查看一个文件的时间信息 如下:

 

           #-atime

           #-mtime

           #-ctime

           #-amin

           #-mmin

           #-cmin

   所以这里atime,mtime,ctime就是分别对应的“最近一次访问时间”“最近一次内容修改时间”“最近一次属性修改时间”,这里的atime的单位指的是“天”,amin的单位是分钟  

          #find  /tmp  –atime  +5           //表示查找在五天内没有访问过的文件

          #find  /tmp  -atime  -5            //表示查找在五天内访问过的文件

          

(6)根据文件类型来查找文件

                -type

                      f     // 普通文件

                      d     //目录文件

                      l     //链接文件

                      b     //块设备文件

                      c     //字符设备文件

                      p     //管道文件

                      s     //socket文件

(7)根据大小来查找文件

               -size

          #find  /tmp  -size   2M           //查找在/tmp 目录下等于2M的文件

          #find  /tmp  -size  +2M           //查找在/tmp 目录下大于2M的文件

          #find  /tmp  -size  -2M           //查找在/tmp 目录下小于2M的文件

(8)根据文件权限查找文件

              -perm

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

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

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

 

(9)-nouser  and  -nogroup

          #find  /  -nogroup –a –nouser       //在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉)

  [查找完执行的action]

         # -print                                 //默认情况下的动作

         # -ls                                     //查找到后用ls 显示出来

         # -ok  [commend]                //查找后执行命令的时候询问用户是否要执行

        # -exec [commend]              //查找后执行命令的时候不询问用户,直接执行

 

这里要注意{}的使用:替代查找到的文件

 

  

     #find  /tmp  -atime  +30  –exec rm –rf  {}  \; #删除查找到的超过30天没有访问过文件

 

     我们也可以使用xargs来对查找到的文件进一步操作

    

(10)ls -ltrh(查看权限)

 

二 locate

首先说下locate这个命令是对其生成的数据库进行遍历(生成数据库的命令:updatedb),这一特性决定了用locate查找文件速度很快,但是locate命令只能对文件进行模糊匹配,在精确度上来说差了点,简单介绍下它的两个选项:

  #locate 

-i        //查找文件的时候不区分大小写 比如:locate  –i   passwd

-n       //只显示查找结果的前N行     比如:locate  -n  5   passwd

 locate(locate) 命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db 。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。整个locate工作其实是由四部分组成的:

  1. /usr/bin/updatedb   主要用来更新数据库,通过crontab自动完成的

  2. /usr/bin/locate         查询文件位置

  3. /etc/updatedb.conf   updatedb的配置文件

  4. /var/lib/mlocate/mlocate.db  存放文件信息的文件

2、用法

locate[OPTION]... [PATTERN]...

3、选项

-b, --basenamematch only the base name of path names-c, --count 只输出找到的数量-d, --database DBPATH 使用DBPATH指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db-e, --existing only print entriesforcurrently existing files-L, --follow follow trailing symbolic links when checkingfileexistence (default)-h, --help 显示帮助-i, --ignore-case忽略大小写-l, --limit, -n LIMIT limit output (or counting) to LIMIT entries-m, --mmap ignored,forbackward compatibility-P, --nofollow, -H don't follow trailing symbolic links when checking file existence-0, --nullseparate entries with NUL on output-S, --statistics don't search for entries, print statistics about eachused database-q, --quiet 安静模式,不会显示任何错误讯息-r, --regexp REGEXP 使用基本正则表达式--regex 使用扩展正则表达式-s, --stdio ignored,forbackward compatibility-V, --version 显示版本信息-w, --wholename match whole path name (default)

 

4、示例

示例1: 搜索etc目录下所有以my开头的文件

[root@cent6 lib]#locate/etc/my/etc/my.cnf

示例2:新增的文件无法locate,使用updatedb

[root@cent6 ~]#touchnew.txt [root@cent6~]#locatenew.txt [root@cent6~]# updatedb [root@cent6~]#locatenew.txt/root/new.txt

示例3:updatedb的配置文件/etc/updatedb.conf

 

[root@cent6 ~]#cat/etc/updatedb.conf PRUNE_BIND_MOUNTS="yes"PRUNEFS="9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"PRUNENAMES=".git .hg .svn"PRUNEPATHS="/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"

 

第一行PRUNE_BIND_MOUNTS="yes"的意思是:是否进行限制搜索。

第二行是排除检索的文件系统类型,即列出的文件系统类型不进行检索。

第二行表示对哪些后缀的文件排除检索,也就是列在这里面的后缀的文件跳过不进行检索。不同后缀之间用空格隔开。

第四行是排除检索的路径,即列出的路径下的文件和子文件夹均跳过不进行检索。updatedb之后使用locate仍然找不到想要文件

可以检查挂载的目录是否被忽略了

 

在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。

  区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。 

               (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。    

三 grep

     基本格式:find  expression

     1.主要参数

    [options]主要参数:
    -c:只输出匹配行的计数。
    -i:不区分大小写
    -h:查询多文件时不显示文件名。
    -l:查询多文件时只输出包含匹配字符的文件名。
    -n:显示匹配行及行号。
    -s:不显示不存在或无匹配文本的错误信息。
    -v:显示不包含匹配文本的所有行。

    pattern正则表达式主要参数:
    \: 忽略正则表达式中特殊字符的原有含义。
    ^:匹配正则表达式的开始行。
    $: 匹配正则表达式的结束行。
    \<:从匹配正则表达 式的行开始。
    \>:到匹配正则表达式的行结束。
    [ ]:单个字符,如[A]即A符合要求 。
    [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
    .:所有的单个字符。
    * :有字符,长度可以为0。

    2.实例  

  (1)grep 'test' d*  #显示所有以d开头的文件中包含 test的行
  (2)grep ‘test’ aa bb cc    #显示在aa,bb,cc文件中包含test的行
  (3)grep ‘[a-z]\{5\}’ aa   #显示所有包含每行字符串至少有5个连续小写字符的字符串的行
  (4)grep magic /usr/src  #显示/usr/src目录下的文件(不含子目录)包含magic的行
  (5)grep -r magic /usr/src  #显示/usr/src目录下的文件(包含子目录)包含magic的行

  (6)grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),

  详细使用参见:https://www.niuxinghao.top/apphtml/scapp/advertising.html?merchant_id=c5c05b29ee4c&advertising_id=123   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值