Linux 查找系统中的文件

使用locatefind即可实现在挂载的文件系统中搜索文件。

locatefind介绍

locate命令

locate命令是搜索预先生成的数据库中的文件名或文件路径,这份数据库正常是由cron计划任务每天自动更新,数据库默认位置在:

Ubuntu /var/cache/locate/locatedb

RHEL/var/lib/mlocate/mlocate.db

如果没有该数据库那么需要手动生成,使用管理员用户执行命令updatedb即可自动生成。

find命令

find是爬取整个文件系统来实时的搜索文件系统,所以搜索比较慢。如果是刚刚添加的文件使用find才能搜索到,因为locate需要等待下一次更新数据库后才能搜索的到新添加的文件。

根据名称查找文件locate

locate命令根据locatedb数据库文件进行搜索并返回文件名和路径,通过数据库查询搜索会非常的快,因此只在你眨眼的功夫你想要搜索的文件路径或名称就显示到你的眼前了。

以普通用户身份搜索条目时,调用locate搜索的用户必须对包含所匹配元素的目录树有读取的权限,否则是不会返回结果的。

在该账户有权限读取的目录树中,搜索名称或路径包含passwd的文件。

1
2
3
4
5
6
7
8
9
locate passwd   # 搜索passwd
/etc/cron.daily/passwd
/etc/pam.d/chpasswd
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-
/etc/security/opasswd
/etc/sudoers.d/010_pi-nopasswd
...

即使文件名或目录包含匹配到的搜索,也会返回结果

1
2
3
4
5
6
7
8
9
locate image    # 搜索image
/home/pi/Tools/fuzzDicts/images
/home/pi/Tools/fuzzDicts/images/README.MD
/home/pi/Tools/fuzzDicts/images/api.jpg
/home/pi/Tools/fuzzDicts/images/directory.jpg
/home/pi/Tools/fuzzDicts/images/fileExt.png
/home/pi/Tools/fuzzDicts/images/parameter.jpg
/home/pi/Tools/fuzzDicts/images/password.jpg
/home/pi/Tools/fuzzDicts/images/sql.jpg

常用选项

-i选项:不区分大小写,对所有大小写字母的组合都会进行匹配。

-l选项:限制locate搜索结果的返回数量,实例如下,限制结果仅返回5个匹配项。

1
2
3
4
5
6
locate  -l 5 v2ray # 搜索`v2ray`并限制结果仅返回5个匹配项。
/etc/systemd/system/multi-user.target.wants/v2ray.service
/etc/systemd/system/v2ray.service
/etc/v2ray
/etc/v2ray/config.json
/home/pi/disk/v2ray_client.json

使用find查找文件

find命令在本地文件系统中实时的搜索,查找符合匹配条件的文件。使用find命令要求当前用户对要查看内容的目录有读取执行的权限。

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

find命令有很多选项,使用这些选项可以对文件进行精确的搜索,比如通过时间戳、文件大小、修改时间等其他文件特性任意组合对文件进行查找和筛选。

常用选项

-name选项:

后面跟上文件名可以查找匹配所给的文件名的文件,并返回该文件的绝对路径。例如若要在文件系统的/根目录下搜索名为ssh_host_rsa_key的文件:

1
2
sudo find / -name "ssh_host_rsa_key"
/etc/ssh/ssh_host_rsa_key

还可以使用通配符搜索文件。使用通配符搜索时一定要将文件名用引号引起,防止当前使用的终端对通配符进行解析。

1
2
3
4
5
6
7
8
9
10
sudo find / -name "*.conf"   
/lib/modprobe.d/systemd.conf
/lib/modprobe.d/aliases.conf
/lib/modprobe.d/fbdev-blacklist.conf
/lib/systemd/system/rc-local.service.d/debian.conf
/lib/systemd/system/systemd-resolved.service.d/resolvconf.conf
/lib/systemd/system/systemd-timesyncd.service.d/disable-with-time-daemon.conf
/lib/systemd/system/user-.slice.d/10-defaults.conf
/lib/systemd/resolv.conf
...

-iname选项:

使用方式和-name选项一致,但使用-iname选项搜索时不区分大小写。并且同样支持通配符搜索文件。

-user-group选项:

可以通过文件的所有者和所有组来对文件进行搜索,-uid-gid也是用来限定文件所有权的选项。并且可以与其他选项如-name搭配使用。例如搜索用户为www所属的全部文件:

1
2
3
4
5
6
7
8
find / -user www # 在根目录下开始搜索文件所有者是`www`的所有文件及目录。
/home/wwwroot/mail.yeefire.com
/home/wwwroot/blog.yeefire.com
/home/wwwroot/blog.yeefire.com/log.txt
/home/wwwroot/blog.yeefire.com/var
/home/wwwroot/blog.yeefire.com/var/Upgrade.php
/home/wwwroot/blog.yeefire.com/var/Typecho
...
1
2
3
sudo find / -user www -name "*yeefire.com"
/home/wwwroot/mail.yeefire.com
/home/wwwroot/blog.yeefire.com