文章目录
3.查找命令
使用Linux系统时时常需要查找文件 ,但是我们往往不能记住文件的确切路径,为了方便查找,Linux系统提供了用于搜索的命令
对于简单查找 可以使用 locate 、 which 命令
对于复杂查找 可以使用 find 、grep 命令
3.1 find 查找(常用)
find 主要根据文件的属性(文件名、文件类型、文件大小、文件目录深度) ,查找对应的磁盘文件。
3.1.1文件名(- name)查找
根据文件名查找 通过 -name命令
有两种方式:精确查询
和 模糊查询
其中模糊查询 需要使用对应的通配符 :*
匹配多字符 | ?
匹配单字符
#根据文件名搜索
$ find 搜索的路径 -name 搜索的文件名
$ find /home -name main.cpp
#模糊搜索
$ find /home -name "*.cpp"
$ find /home -name he*.cpp #我提前创建好hello.cpp
#精确搜索
$ find /home -n hello.cpp
3.1.2文件类型(- type)查找
Linux系统中有 7种文件类型 ,通过文件类型find 查找使用 -type 命令
文件类型 | 类型的字符描述 |
---|---|
普通文件类型 | f |
目录类型 | d |
软连接类型 | l |
字符设备类型 | c |
块设备类型 | b |
管道类型 | p |
本地套接字类型 | s |
#语法格式
$ find 搜索的路径 -type 搜索的文件名
#查询当前目录的所有普通文件
$ find ./ -type f
3.1.3文件大小(- size)查找
如果需要根据文件大小进行搜索,需要使用参数 -size。关于文件大小的单位有很多,可以根据实际需求选择,常用的分别有 k(小写), M(大写), G(大写)。
# 语法格式:
$ find 搜索的路径 -size [+|-]文件大小
- 文件大小需要加单位:
- k (小写)
- M (大写)
- G (大写)
# 搜索当前目录下 大于1M的所有文件 (file>3M)
$ find ./ -size +3M
# 搜索当前目录下 大于等于0M并且小于等于2M的文件 (0M <= file <=2M)
$ find ./ -size -3M
# 搜索当前目录下 大于2M并且小于等于3M的文件 (2M < file <=3M)
$ find ./ -size 3M
# 搜索当前目录下 大于1M 并且 小于等于 3M 的文件
$ find ./ -size +1M -size -4M
关于文件大小的区间划分非常重要,请仔细阅读,并思考,可以自己画个图,这里以 4k 来举例:
-size 4k 表示的区间为 (4-1k,4k], 表示一个区间,大于 3k, 小于等于 4k
-size -4k: [0k, 4-1k], 表示一个区间,大于等于 0 并且 小于等于 3k
-size +4k: (4k, 正无穷), 表示搜索大于 4k 的文件
3.1.4目录层级
因为 Linux 的目录是树状结构,所有目录可能有很多层,在搜索某些属性的时候可以指定只搜索某几层目录,相关的参数有两个,分别为: -maxdepth 和 -mindepth。
-maxdepth:
最多搜索到第几层目录
-mindepth:
至上从第多少层开始搜索
# 查找文件, 从根目录开始, 最多搜索5层, 这个文件叫做 *.txt (1 <= 层数 <= 5)
$ sudo find / -maxdepth 5 -name "*.txt"
# 查找文件, 从根目录开始, 至少从第5层开始搜索, 这个文件叫做 *.txt (层数>=5层)
$ sudo find / -mindepth 5 -name "*.txt"
3.1.5 同时执行多个操作(find高级操作)
在搜索文件的时候如果想在一个 find 执行多个操作,方式:exec 、 ok 、xargs
exec
在参数 -exec 后添加的 shell 命令处理的是 find 搜索之后的结果,find 的结果会作为 新添加的 shell 命令 的输入,最后在终端上输出最终的处理结果。
# 语法:
$ find 路径 参数 参数值 -exec shell命令2 {} \;
# 搜索最多两层目录, 文件名后缀为 .txt的文件
$ find ./ -maxdepth 2 -name "*.txt"
./luffy/robin.txt
./luffy/onepiece.txt
./onepiece.txt
# 搜索到满足条件的文件之后, 再继续查看文件的详细属性信息
$ find ./ -maxdepth 2 -name "*.txt" -exec ls -l {} \;
-rw-r--r-- 1 root root 0 Jan 25 17:54 ./luffy/robin.txt
-r--r--r-- 2 root root 37 Jan 25 17:54 ./luffy/onepiece.txt
-r--r--r-- 1 root root 37 Jan 26 16:50 ./onepiece.txt
ok
-ok 和 -exec 都是 find 命令的参数,使用方式类似,但是这个参数是交互式的,在处理 find 的结果的时候,会向用户发起询问,比如在删除搜索结果的时候
# 语法: 其实就是将 -exec 替换为 -ok, 其他都不变
$ find 路径 参数 参数值 -ok shell命令2 {} \;
#举例
$ find ./ -name "*.txt" -ok rm{}\;
xargs
有一种看起来更加直观、书写更加简便的方式,我们可以使用 xargs 替换掉 -exec 参数,而且在处理数据的时候 xargs更高效。有了 xargs 的加持我们就可以在 find 命令中直接使用管道完成前后命令的数据传递
# 在find 中 使用 xargs 关键字我们就可以使用管道了, 否则使用管道也不会起作用
# 将 find 搜索的结果通过管道传递给后边的shell命令继续处理
$ find 路径 参数 参数值 | xargs shell命令2
# 查找文件
$ find ./ -maxdepth 1 -name "*.cpp"
./occi.cpp
./main.cpp
./test.cpp
# 查找文件, 并且显示文件的详细信息
robin@OS:~$ find ./ -maxdepth 2 -name "*.cpp" | xargs ls -l
-rw-r--r-- 1 robin robin 2223 Mar 2 2020 ./main.cpp
-rw-r--r-- 1 robin robin 1406 Mar 2 2020 ./occi.cpp
-rw-r--r-- 1 robin robin 2015 Mar 1 2020 ./test.cpp
3.2 grep 查找
grep 命令
用于查找文件里符合条件的字符串 ,常用参数 :
- -r: 如果需要搜索目录中的文件内容,需要进行递归操作,必须指定该参数
- -i: 对应要搜索的关键字,忽略字符大小写的差别
- -n: 在显示符合样式的那一行之前,标示出该行的列数编号
# 语法格式:
$ grep "搜索的内容" 搜索的路径/文件 参数
对应要搜索的文件内容,建议放到引号中,因为关键字中可能有特殊字符,或者有空格,从而导致解析错误。
#举例
$ grep “#include” ./hello.cpp -n
$ grep “#include” ./ -r
3.3 locate
locate 作为一个弱化版的 find ,可以通过
locate 命令 根据文件名搜索本地的磁盘文件
,locate 的效率比 find 高很多 ,因在于它不搜索具体目录,而是搜索一个本地的数据库文件,这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用 locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
# 使用管理员权限更新本地数据库文件, root用户这样做
$ updatedb
# 非root用户需要加 sudo
$ sudo updatedb
$ locate hello #搜索所有目录 含有hello 的文件
#搜索指定绝对路径下 某个文件
$ locate /tmp/demo/hello
#搜索文件的时候,忽略文件名的大小写
$ locate HELLO -i
#显示前N个匹配的文件名
$ locate hello -n 5 #显示5个 前缀为hello的信息