Linux 文件检索 | locate、grep、find
Linux 中查找文件或关键词检索文件内容是很常用的功能
合理使用命令,高效检索需要的结果
本文系统 Amazon Linux 2
locate
通常 locate 命令系统会自带,如果没有则需要安装 mlocate
locate 搜索文件速度很快,因为它不去实际目录中找文件,而是在文件数据库对应的文件中直接查找。
数据库中含有本地所有本地文件信息,但是不包含当天新建的文件,因为数据库文件每天自动更新一次。
数据库文件通常在 /var/lib/mlocate/mlocate.db
或 /var/lib/locatedb
每天更新数据库的 cron 在 /etc/cron.daily/mlocate
如果想要查找当天新建的文件,可以执行 updatedb
手动更新数据库文件
用法
-
常用参数
-c
返回查找的数量-l [数字]
限制返回行数-r
通过正则匹配查找 -
常用方式
# 查找所有包含 test 的文件
locate test
# 查找所有 /etc 目录下的 conf 文件,并显示两条
locate -l 2 /etc/*.conf
grep
使用正则表达式搜索过滤文件内容
在一个文件中检索关键词
# 在 test.txt 文件中检索关键词 ha
grep ha test.txt
多个文件中检索
# 在 三个 test 文件中检索关键词 哈
grep ha test1.txt test2.txt test3.txt
检索除外内容 -v
# 检索不包含 hello 的文件内容
grep -v hello test.txt
正则表达式检索 -E
# 检索包含小写字母的内容
grep -E '[a-z]+' test.txt
# 或
egrep '[a-z]+' test.txt
统计检索到的行数 -c
# 检索包含小写字母的内容,并统计行数
grep -Ec '[a-z]+' test.txt
检索内容显示行号 -n
# 检索包含关键词 ha 的内容,并显示行号
grep -n 'ha' test.txt
检索内容输出文件名 -l
# 在两个 test 文件中检索包含关键词 ha 的文件
grep -l 'ha' test1.txt test2.txt
递归检索 -r
# 在当前目录的所有文件中检索关键词 ha,并在结果中显示行号
grep -rn 'ha' ./
忽略大小写 -i
# 检索包含 hello 或 HELLO 的内容
grep -i 'hello' test.txt
排除指定关键词 -v
# 排除包含 ha 的行,输出其他行
grep -v 'ha' test.txt
同时检索多个关键词 -e
# 检索包含 ha 或 hello 的内容
grep -e 'ha' -e 'hello' test.txt
调用关键词文件 -f
# key 文件中列出了所有要检索的关键词或正则规则
# 在 test 文件中检索包含 key 中任意关键词的内容
grep -f key test.txt
检索时包含或排除指定文件 --include、--exclude
# 在当前目录的所有 php 和 html 文件中检索 hello 关键词
grep -rl 'hello' ./ --include *.{php.html}
# 在当前目录下,除 back 文件以外的文件中检索 hello 关键词
grep -rl 'hello' ./ --exclude 'back'
# 将排除的多个文件写入 exclude_key 文件中并调用
grep -rl 'hello' ./test/ --exclude-from exclude_key
# 排除指定目录 --exclude-dir
grep -rl 'hello' ./ --exclude-dir={BACK,OLD,old,TEMP,temp,templates_c,cache}
输出匹配内容之前或之后的行 -A、-B、-C
# 显示匹配内容的后面三行
grep 'test' test.txt -A 3
# 显示匹配内容的前面三行
grep 'test' test.txt -B 3
# 显示匹配内容的前三行和后三行
grep 'test' test.txt -C 3
find
可以用来查找不同大小、不同类型、不同创建时间、不同名字的文件
根据文件名查找 -name -iname
# 查找当前目录及子目录下,test.txt 文件
find ./ -name test.txt
¥ 根据一部分文件名查找,文件名一定要有
find ./ -name te*.*
# 没有文件名只有后缀,则需要引号
find ./ -name '*.txt'
# 查找隐藏文件
find ./ -name '.*'
# 文件名不区分大小写 iname
find ./ -iname test.*
根据文件类型查找 -type
# 查找当前目录下及子目录的所有文件
find ./ -type f
# 查找软连接
find ./ -type l
# 查找目录
find ./ -type d
根据文件修改时间查找 -mtime、-atime、-ctime
每个文件有三个时间:
-
mtime 文件最后修改时间
-
atime 文件最后访问时间
-
ctime 文件权限最后修改时间
# 查找当前目录及子目录下 7 天前修改过的 txt 文件
find ./ -mtime +7 -name '*.txt'
根据文件大小查找 -size
用到的单位有以下几种:
-
G GB
-
M MB
-
k KB
-
w 双字节字
-
c 字节
-
b 512 字节块(默认)
# 查找当前目录及子目录下,大于 2M 小于 10M 的所有 txt 文件
find ./ -size +2M -size -10M -name '*.txt'
根据文件权限查找 -perm
# 查找当前目录及子目录中,权限为 600 的文件
find ./ -perm 600 -type f
# 必须包含指定的所有权限 rw-------,比如 rwxr--r-- 包含会被查出来
find ./ -perm -600 -type f
# 只要包含其中一个 rw-------,比如 r-xr--r-- 包含会被查出来
find ./ -perm +600 -type f
根据文件用户、用户组查找 -user、-group、-uid、-gid、-nouser
# 查找当前目录及子目录中,属于 test 用户的所有文件
find ./ -user test
# 查找没有所属用户的文件
find ./ -nouser -type f
# 查找组 ID 为 200 的文件
find ./ -gid 200 -type f
指定查找深度
# 查找当前目录下的文件
find ./ -maxdepth 1 -type f
使用逻辑运算
-
-a 逻辑与
-
-o 逻辑或
-
-not 逻辑非
# 查找文件大于 2M 且后缀为 txt 的文件
find ./ -size +2M -a -name '*.txt'
# 查找名字为 test 或 back 的文件
find ./ -name back.* -o -name test.*
# 查找文件名不是 test 的文件
find ./ -not -name test.*
查找后执行其他命令 -exec、-ok
-
find 命令的结果放在 {} 中,并作为后面的 -exec 命令的输入值
-
-ok 和 -exec 作用相同,但前者在执行第二个命令前会询问
# 查找 test 的文件后,执行 ls -l 查看文件具体信息
# {} 和 \ 之间必须有空格,且这两块是必须的
find ./ -name test.txt -exec ls -l {} \;
# 执行 ls -l 前会询问
find ./ -name test.txt -ok ls -l {} \;
Linux 中检索文件,检索过滤内容,这三个命令几乎都能满足。
在高级一点儿还有 sed、awk。
初次之外第三方扩展工具还有很多很多。