天天看点

linux 文件查找命令集:find,locate,wheres,which,type

文章目录

  • ​​前言​​
  • ​​find命令​​
  • ​​命令格式:​​
  • ​​常用选项:​​
  • ​​举例使用​​
  • ​​locate命令​​
  • ​​命令格式​​
  • ​​使用实例​​
  • ​​whereis命令​​
  • ​​使用过程:​​
  • ​​which命令​​
  • ​​type命令​​

前言

在linux系统中一切皆文件,此时我们想要从海量的文件中快速定位中我们想要的文件来,需要指定的命令来操作。以下为收集的各个命令,以及其优劣,使用方式。

find命令

centos下:rpm包​

​findutils-4.5.11-3.el7.x86_64​

​ find是最常用也是最强大的查找命令,它可以查找任何类型的文件。

命令格式:

​find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]​

linux 文件查找命令集:find,locate,wheres,which,type
常用选项:
  • ​-name​

    ​:按文件名来查找文件
  • ​-user​

    ​:按照文件的属主来查找文件
  • ​-group​

    ​:按照文件所属的组来查找文件
  • ​-perm​

    ​:按照文件权限来查找文件
  • ​-prune​

    ​:不在当前指定目录中查找
举例使用

已知文件​

​stdio.h​

​​存放在​

​/usr​

​大目录下的多个子目录,cd /usr目录下

​find -name "stdio.h"​

​​ 表示在当前目录查找文件名称为​

​stdio.h​

​的文件

linux 文件查找命令集:find,locate,wheres,which,type

​find . -path ./include -prune -o -name "stdio.h"​

​​ 在当前目录查及其子目录查找名称为​

​stdio.h​

​的文件,但是跳过include目录;

这里的-o参数表示或关系,即两者中只要有一个表达式满足true即可输出;

同​

​-a​

​​和​

​-not​

​​,​

​-a​

​​表示只要有一个表达式不满足则不输出,​

​-not​

​表示对查找的结果进行取反

linux 文件查找命令集:find,locate,wheres,which,type

​find . -path ./include -o -name "stdio.h" -print​

​ 将匹配到的内容文件输出到标准输出中

linux 文件查找命令集:find,locate,wheres,which,type

​find / -user ceph​

​​ 查找文件所有者为​

​ceph​

​的文件

​find / -nouser -a -nogroup​

​ 查找系统中不属于任何人,任何用户组的文件(对于该部分文件需要保持警惕)

linux 文件查找命令集:find,locate,wheres,which,type

​find /usr -mtime -4​

​查找文件更新日时在距现在时刻4天以内的文件

​find /usr -mtime +4​

​ 查找文件更新日时在距现在时刻5天以上的文件

​find /usr -mtime 4​

​查找文件更新日时在距现在时刻4天以上5天以内的文件

​find / -type [c]​

​​ 根据文件属性进行查找

其中[c]包括如下属性:

  • ​p​

    ​​ 管道文件​

    ​/run/systemd/initctl/fifo​

  • ​b​

    ​ block块设备文件,类似与/dev/sdb磁盘盘符这种
  • ​c​

    ​​ 字符设备,类似于​

    ​/dev/tty63​

  • ​d​

    ​ directory 目录文件
  • ​f​

    ​ regular file 普通文件
  • ​l​

    ​ symbolic link 链接文件
  • ​s​

    ​ socket 套接字文件

​find / -size +10M​

​​ 按照文件大小进行查找,+表示大于10M的文件,​

​-​

​表示小于10M的文件,同时还支持K,G,b(512B的块大小)的单位查找

locate命令

centos下:rpm包为​

​mlocate-0.26-5.el7.x86_64​

​​ locate命令实际是"find -name"的另一种写法,但是查找方式跟find不同,它比find快得多。

因为它不搜索具体目录,而是在一个数据库(​

​/var/lib/mlocate/mlocate.db​

​)中搜索指定的文件。次数据库含有本地文件的所有信息,此数据库是linux系统自动创建的,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,默认情况下为每天更新一次,所以用locate命令你搜索不到最新更新的文件,除非你在用locate命令查找文件之前手动的用updatedb命令更新数据库。

命令格式

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

linux 文件查找命令集:find,locate,wheres,which,type

主要使用的参数含义如下:

  • ​-A​

    ​ 打印所有匹配到的文件
  • ​-b​

    ​ 精确匹配需要查找的文件,即如果文件命中包含我们要查找的则不打印
  • ​-c​

    ​ 仅打印匹配到文件个数
  • ​-d --database DBPATH​

    ​ 指定自己的文件数据库
  • ​-e​

    ​ 打印当前系统存在的想要查找的文件
  • ​-i​

    ​ 忽略匹配出来的文件的差异
  • ​-m​

    ​ 已经被忽略了,为了向后兼容
  • ​-l count 或者 -n count​

    ​ 限制输出的条数
  • ​-r​

    ​​ 支持普通的正则匹配,类似​

    ​locate -r ceph-osd.[0-9]​

    ​ 查找ceph-osd.后面有一个数字的文件
  • ​-w​

    ​ 精确匹配,默认不加也是精确匹配
使用实例

这里关于参数详细的使用就不多说,以上都已经提到

这里简单说一下locate的正则匹配,基本的正则符号参考​​正则符号​​ 举例:

​locate -r ceph-osd.[0-9].log$​

​ 查找以包含​

​ceph-osd​

​的字符串,且在ceph-osd.和.log之间有一个数字,且以log字符串结尾的文件

linux 文件查找命令集:find,locate,wheres,which,type

我们在使用locate的很多时候发现一个新的文件locate不到,关于locate命令的基本查找过程上面也已经提到,因为locate的文件获取是从操作系统定时更新的数据库中获取,但是新的文件可能还没有更新到数据库(还没有被系统设置的定时任务去更新数据库),此时我们需要手动更新以下该数据库。

关于mlocate.db数据库的更新任务在路径为​

​/etc/cron.daily/mlocate​

​中,内容如下

#!/bin/sh
nodevs=$(< /proc/filesystems awk '$1 == "nodev" && $2 != "rootfs" { print $2 }')
renice +19 -p $$ >/dev/null 2>&1
ionice -c2 -n7 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"      

我们做出如下测试

[root@node2 ~]# echo "i am a man" >test.cron
[root@node2 ~]# locate test.cro
[root@node2 ~]# updatedb  手动跟新数据库
[root@node2 ~]# locate test.cron   手动更新即可发现我们创建的文件已经存在
/root/test.cron      

whereis命令

centos下的rpm包​

​util-linux-2.23.2-26.el7.x86_64​

​ whereis命令只能用于搜索二进制文件(-b)、源代码文件(-s)、说明文件(-m)。如果省略参数则返回所有的信息

使用起来也是非常简单

linux 文件查找命令集:find,locate,wheres,which,type
使用过程:
[root@node2 ~]# whereis locate
locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
[root@node2 ~]# whereis -b locate
locate: /usr/bin/locate
[root@node2 ~]# whereis -m locate
locate: /usr/share/man/man1/locate.1.gz
[root@node2 ~]# whereis -s locate
locate:[root@node2 ~]#      

该命令能够方便编译机上的组件以及对应源码的查找

which命令

[root@node2 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/root/perl5/bin:/b_iscsi/bn_cli:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@node2 ~]# which locate
/bin/locate      

type命令

[root@node2 ~]# type cd
cd is a shell builtin
[root@node2 ~]# type find
find is hashed (/bin/find)