查找命令 3个月前

编程语言
329
查找命令

当查找的需求比较简单时可以使用 locate which whereis 复杂时可以使用find和grep

对应要搜索的文件内容, 建议放到引号中, 因为关键字中可能有特殊字符, 或者有空格, 从而导致解析错误。 关于引号, 单双都可以

1.find

find 的功能非常强大,可根据文件属性进行查找

①文件名(-name)

#根据文件名搜索的语法
find 搜索路径 -name 要搜索的文件名
##可以使用模糊搜索(*,?)这些模糊搜索关键字
#eg:搜索 root 家目录下文件后缀为txt的文件
find /root -name "*.txt"

②文件类型(-type)

#语法格式
find 搜索路径 -type 文件类型
文件类型 类型的字符描述
普通文件类型 f
目录类型 d
软连接类型 l
字符设备类型 c
块设备类型 b
管道类型 p
本地套接字类型 s
#eg:root目录下软链接类型的文件
find /root -type l

③文件大小(-size)

#语法格式
find 搜索路径 -size [ +|- ] 文件大小
            #文件大小需要加单位
            #-k(小写)
            #-M
            #-G

文件大小区间非常重要 1.-size 4k : 表示的区间为(3k,4k] 2.-size -4k : 表示的区间为(0k,3k] 3.-size -4k : 表示的区间为(4k,无穷)

#eg:搜索当前目录下大于1M且小于等于3M的文件
find ./ -size +1M -size -3M

④目录层级

由于Linux目录是树形,所以目录可能有很多层

#语法格式
find 搜索路径 -maxdepth n 搜索属性 属性参数 #搜索最多n层
find 搜索路径 -mindepth n 搜索属性 属性参数 #搜索最少n层

这两个参数不能单独使用,必须和其他属性一起使用

#eg:从根目录开始搜索,最多5层,文件后缀为.txt
sudo find / -maxdepth 5 -name "*.txt"

⑤同时执行多个操作

5.1: -exec

-exec 是find的参数, 可以在exec参数后添加其他需要被执行的shell命令。

#语法格式
find 路径 参数 参数值 -exec shell命令 {} \;
#结尾要加上{} \;
且{} \之间有空格
#eg: 搜索最多两层目录,以 .txt结尾的文件,并查看文件信息
find ./ -maxdepth 2 -name "*.txt" -exec ls -l {} \;

5.2: -ok

加入 -ok 执行shell时会向用户发起询问,比如在删除搜索结果的时候

#语法格式
find 路径 参数 参数值 -ok shell命令 {} \;
#eg:
find ./ -maxdepth 1  -name "*.txt" -ok ls -l {} \; 
##之后同意显示文件信息,同理删除时询问是否删除

5.3: xargs

xargs 参数不同于 -exec和-ok 需要在结尾加符号,有着更直观简便的写法 并且在处理数据时 xargs更高效 -exec: 将find查询的结果逐条传递给后边的shell命令 xargs: 将find查询的结果一次性传递给后边的shell命令

#语法格式
find 路径 参数 参数值 | xargs shell命令
#eg:查找文件并显示信息
find ./ -maxdepth 1  -name "*.cpp" | xargs ls -l

2.grep

#语法格式
grep "搜索内容" 搜索的路径/文件 参数
#    参数: -r :搜索目录中的文件内容时,必须加上-r
#         -i :忽略大小写
#          -n :显示符合搜索结果那一行之前显示行号
#eg:搜索指定目录中哪些文件中包含字符串 include 并且显示关键字所在的行号
grep "include" ./ -rn

3.locate

locate可看作是一个简化版的find, 但是locate的效率比find要高很多。 原因在于它不搜索具体目录,而是搜索一个本地的数据库文件,这个数据库中含有本地所有文件信息。 Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动的文件。 为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

#先进行数据库更新
sudo update

#语法格式
locate xxx                      #搜索所有目录下以 xxx 开头的文件
locate /home/sewerperson/xxx #指定搜索目录下以 xxx 开头的文件
locate XxX -i                 #-i 忽略搜索文件名的大小写(以xxx开头的文件也能搜索出来)
locate xxx -n 5               #搜索前缀为xxx的文件,并且只显示前5个匹配到的
locate -r "\.cpp$"             #-r 表示可以使用正则表达式 (以.cpp结尾的文件)

关于正则表达式

在正则表达式中 .可以匹配任意一个 非 \n的单字符
上边的命令中使用转译字符\对特殊字符.转译, 就得到了普通的字符.
在正则表达式中 $放到字符尾部, 表示字符串必须以这个字符结尾, 上边的命令中修饰的是字符p
正则表达式中的 字符c和后边的字符p需要进行字节匹配, 没有特殊含义
通过上面的解释 \.cpp$ 说的就是以 .cpp结尾的字符串
image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223060
累计阅读

热门教程文档

Linux
51小节
Python
76小节
C
14小节
Gin
17小节
Vue
25小节