不辜负每一天

Linux的文件查找

2019.07.01

脚本文件的查找

whcih

which 用于查找可执行文件,它是根据PATH的环境变量所规定的路径来查找文件

# 用法
$ whcih [-a] command

# 选项与参数
-a 	: 列出所有的结果

# 查找which的文件名
$ which -a which
which: shell built-in command
/usr/bin/which
/bin/which

文件的查找

在linux中,有三个命令可用于文件查找:whereis, locate, find,三者有一定的区别,各有其优劣。

whereis

whereis 只是查找系统中某些特定目录下的文件,如 /bin/sbin 下面的执行文件和 /usrshare/man 下面的 man page 文件,所以查找的速度非常快。但它只是查找几个特定目录下的文件,查找范围十分有限。

可以利用 whereis -l 来查看 whereis 究竟查找了多少目录

whereis 的用法

$ whereis [-bmsu] <filename>

# 选项与参数
-b	: 只查找二进制文件
-m	: 只找在说明文件manuals路径下的文件
-s	: 只找源文件
-u	: 只找不在上述三个项目中的其他特殊文件

locate

locate 是从数据库(/var/lib/mlocate/)中查找数据,查找速度也非常快。但由于linux中的数据库默认是每天更新一次,所以当要查找在数据库更新之后才新建立的文件时,它会告诉你此文件不存在。这是一个不好的地方,但还有补救措施,可以手动更新数据库

$ updatedb

updatedb 会根据 /etc/updatedb.conf 的设置取查找系统硬盘内的文件,并更新 /var/lib/mlocate内的数据库文件。由于它是将数据写入数据库文件,所以需要root权限。并且因为 updatedb 是查找硬盘文件,所以可能执行速度较慢。

还有一点,locate 是根据用户输入的关键字与数据库的记录进行匹配,所以可以不像 whereis 一样必须输入完整的文件名,只需输入关键字即可。

# 用法
$ locate [-ir] <keyword>

# 选项与参数
-i	: 忽略大小写差异
-r	: 后面可接正则表达式的匹配方式
-c	: 只显示文件数量
-l	: 仅输出几行
-S	: 输出locate所使用的数据库文件的相关信息,包括文件目录数量

# 查找关键字api,并仅显示10行
$ locate -l 10 api

# 显示查询的数据库文件信息
$ locate -S

find

find 的功能十分强大,不但能根据文件名查找文件,还能根据时间、用户、权限、文件大小等条件查找文件,并且还可以指定查找的目录(连同子目录)进行查找。但由于它是针对硬盘进行查找,十分消耗硬盘资源,速度很慢,不推荐使用,显然whereis和locate是优先选择。

选项与参数

选项与参数 含义
-name filename 根据文件名查找文件
-size [+-]SIZE[ck] 查找大于(+)或小于(-)SIZE大小的文件,c为bytes,k为kb
-mtime [+-]n 在n天之前(+),第n天中,n天之内(-)修改过内容的文件
-type TYPE 根据文件类型查找,类型有f, d, b, c, l, s, p
-perm [-/]mode 查找刚好等于mode,全部囊括mode(-)和包含任一mode权限(/)的文件,mode为数字形式
-atime [+-]n 同上,被读取过的文件
-ctime [+-]n 同上,修改过状态的文件
-newer file 列出比 file 还要新的文件,file 必须包含路径(绝对相对均可)
-user name 根据用户名查找该用户的文件
-uid n 根据用户ID(为数字)查找该用户的文件
-groud name 同上
-gid n 同上
-nouser 查找文件的拥有者不在 /etc/passed 中
-nogroup 同上
-exec cmd 可接其他命令来处理查找到的结果

用法示例

$ find [PATH] [option] [action]

# 在系统下查找api.md文件
$ find / -name api.md

# 在当前目录下查找大于20b的文件
$ find . -size +20c

# 在当前目录下查找类型为目录的文件
$ find . -type d

# 在家目录下查找三天内修改过内容的文件
$ find /home -mtime -3

# 查找属于lawler的文件
$ find . -user lawler

# 查找权限等于0664的文件
$ find . -perm 0664

# 在上一层目录下查找比x.md新的文件且列出详细信息,并将结果输出到a.md文件中
$ find ../ -newer ./x.md -exec ls -l {} > a.md \;

-exec 参数中,{} 代表的是 find 查找到的结果,最后的 \; 代表命令的结束