Linux有两个常用的查找命令:find和locate

find的特点通过搜寻硬盘来做实时查找,可以精确匹配,但是速度较慢。

locate是非实时查找,根据数据库来搜寻,因此速度更快,但是属于模糊查找,不够精确。


1.find

1.1 find的使用格式如下:

find [查找位置] [查找标准] [处理动作]
  • 查找位置:默认为当前目录;也可用.来表示当前目录,用~来代表家目录,用/来表示系统根目录。
  • 查找标准:默认为查找指定目录下的所有文件;
  • 处理动作:显示到标准输出;


1.2 查找标准多个选项:

-name "文件名称": 根据文件名查找,支持glob, *, [ ], ? 例如:
想要在当前目录及子目录中查找所有的‘*.txt’文件,可以用:
# find . -name  "*.txt"
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
# find . -name  "[A-Z]*" -print
想要在/etc目录中查找文件名以host开头的文件,可以用:
# find /etc -name  "host*" -print


-iname "文件名称":根据文件名查找,不区分字符大小写;


-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。

  • 这个 SIZE 的规格有:  
  • c: 代表 byte
  • k: 代表 kb
  • M: 代表MB
  • G: 代表GB 。
例如在当前目录下查找文件长度大于1M字节的文件
# find . -size  +1M
在/etc目录下查找文件长度小于为100字节的文件
# find /etc -size -100c


-type TYPE:搜寻文件的类型为 TYPE 的,类型主要有:

  • f: 普通文件
    d: 目录
    b: 块设备
    c: 字符设备
    l: 符号链接
    p: 命名管道
    s: 套接字文件

例如要在/etc目录下查找所有的目录:
# find /etc -type d
在/etc目录下查找所有的符号链接文件:
# find /etc -type l



-perm [+-] MODE: 按照文件权限模式来查找文件

  • 没有[+|-]表示精确权限匹配;
  • +MODE: 任何一类用户的任何一位权限匹配即可;
  • -MODE: 每类用户的每位权限都匹配;
例如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件:
# find . -perm 755
如果希望在当前目录下查找所有用户都可读、写、执行的文件:
# find . -perm  -007


-user USERNAME: 根据属主查找;

-group GRPNAME: 根据属组查找;

-uid UID:根据UID查找
-gid GID:根据GID查找
-nouser:查找没属主的文件;
-nogroup: 查找没有属组的文件;
查找/home 底下属于Jerry 的文件
 # find /home -user Jerry
查找系统中不属于任何人的文件
 # find / -nouser



-mtime [+|-] n  与时间有关的选项:共有 -atime, -ctime 与 -mtime 。例如希望按照更改时间来查找文件,可以使用mtime选项。用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。

在系统根目录下查找更改时间在5日以内的文件:
# find / -mtime -5
在/var/log目录下查找更改时间在3日以前的文件:
# find /var/log -mtime +3
将系统上面过去24 小时内有更动过内容的文件列出:
# find / -mtime 0
注:0代表目前的时间


组合查找条件:
-a: 与
-o:或
-not, !: 非
查找/usr目录下不属于root,bin,或student的文件:
#find /usr -not \( -user root -o -user bin -o -user student \)
#find /usr -not -user root -a -not -user bin -a -not -user student

1.3 处理动作:
-print: 显示到标准输出;
-ls: 显示查找到的文件的详细信息;
-exec COMMAND \; 一旦find命令匹配到了相应的文件,就可以用-exec选项中的命令对其进行操作exec选项后面跟随着所要执行的命令,然后是一对{},一个空格和一个\,最后是一个分号。
将/tmp目录下访问时间大于30天的文件重命名为原文件名.old
# find /tmp -atime +30 -exec mv {} {}.old \;
查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
# find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

-ok COMMAND \;  每次修改要求确认


2. locate


locate命令其实是"find -name"的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。


locate命令的使用格式:

locate [-ir] keyword

-i  :忽略大小写的差异;

-r  :后面可接正规表示法的显示方式

找出系统中所有与passwd相关的文件:
# locate passwd
搜索etc目录下所有以sh开头的文件:
# locate /etc/sh
搜索用户主目录下,所有以m开头的文件:
# locate ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写
# locate -i ~/m