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。

初次之外第三方扩展工具还有很多很多。

posted @ 2023-06-13 12:55  菜乌  阅读(3647)  评论(0编辑  收藏  举报