Linux查命令(find)详解
1. ⽂件查
在⽂件系统上查符合条件的⽂件
命令解释
which查看可执⾏⽂件的位置,只能寻执⾏⽂件,并在PATH变量⾥⾯寻
whereis查看⽂件的位置;只能查⼆进制⽂件,说明⽂档,源⽂件等
locate配合数据库查看⽂件位置;能查所有,但跟whereis⼀样都是查询数据库⾥⾯的内容(/var/lib/locatedb),速度快,但是有延时,极耗资源find实际搜索硬盘查询⽂件名称;最强⼤,但是检索硬盘,⽐较慢
1.1 find
find是最常见和最强⼤的查命令,你可以⽤它到任何你想的⽂件。
find的使⽤格式如下:
$ find <;指定⽬录> <;指定条件> <;指定动作>
# <;指定⽬录>:所要搜索的⽬录及其所有⼦⽬录。默认为当前⽬录。
# <;指定条件>:所要搜索的⽂件的特征。
# <;指定动作>:对搜索结果进⾏特定的处理。
如果什么参数也不加,find默认搜索当前⽬录及其⼦⽬录,并且不过滤任何结果(也就是返回所有⽂件),将它们全都显⽰在屏幕上。
find的使⽤实例:
$ find . -name 'my*'
搜索当前⽬录(含⼦⽬录,以下同)中,所有⽂件名以my开头的⽂件。
$ find . -name 'my*' -ls
搜索当前⽬录中,所有⽂件名以my开头的⽂件,并显⽰它们的详细信息。
$ find . -type f -mmin -10
搜索当前⽬录中,所有过去10分钟中更新过的普通⽂件。如果不加-type f参数,则搜索普通⽂件+特殊⽂件+⽬录。
1.2 locate
locate 依赖于查询系统上实现构建好的⽂件索引数据库 /var/lib/mlocate/mlocate.db
索引的构建是在系统较为空闲时⾃动进⾏(周期性任务),执⾏updatedb可以更新数据库
索引构建过程需要遍历整个根⽂件系统,很消耗资源
locate和updatedb命令来⾃于mlocate包
locate命令其实是"find -name"的另⼀种写法,但是要⽐后者快得多,原因在于它不搜索具体⽬录,⽽是搜索⼀个数据库
(/var/lib/locatedb),这个数据库中含有本地所有⽂件信息。Linux系统⾃动创建这个数据库,并且每天⾃动更新⼀次,所以使⽤locate 命令查不到最新变动过的⽂件。为了避免这种情况,可以在使⽤locate之前,先使⽤updatedb命令,⼿动更新数据库。
1.2.1 索引库的更新有两种⽅式
系统⾃动实现(周期性任务)
⼿动更新数据库(命令:updatedb)
1.2.2 ⼯作特性
查速度快(基于数据库实现)
模糊查
⾮实时查
搜索的是⽂件的全路径,不仅仅是⽂件名
可能只搜索⽤户具备读取和执⾏权限的⽬录
1.2.3 命令使⽤格式
locate [OPTION]...
选项:
header 1header 2
-b 只匹配路径中的基名,⽽⾮整个路径名例:locate -b nginx
-c
统计出共有多少个符合条件的⽂件例:locate -c nginx;locate -b -c nginx
-r基于基本正则表达式来编写模式
-i不区分⼤⼩写的搜索
-n N只列举前N个匹配项⽬
注意:索引构建过程需要遍历整个根⽂件系统,极消耗资源
⽰例:
# 搜索etc⽬录下所有以sh开头的⽂件。
$ locate /etc/sh
# 搜索⽤户主⽬录下,所有以m开头的⽂件。
$ locate ~/m
# 搜索⽤户主⽬录下,所有以m开头的⽂件,并且忽略⼤⼩写。
$ locate -i ~/m
# 搜索名称或路径中包含"conf"的⽂件
locate conf
# 使⽤Regex来搜索以".conf"结尾的⽂件
locate -r '\.conf$'
⽰例:locatedb创建数据库
[root@centos8 ~]#dnf -y install mlocate
[root@centos8 ~]#locate conf
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
[root@centos8 ~]#updatedb
[root@centos8 ~]#ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1040305 Apr 24 14:54 /var/lib/mlocate/mlocate.db
[root@centos8 ~]#locate -n 3 conf
/backup/etc_2021-04-01/chkconfig.d
/backup/etc_f
/backup/etc_f.d
[root@centos8 ~]#
⽰例:⽂件新创建和删除,⽆法马上更新locate数据库
[root@centos8 ~]#touch test_redis.log
[root@centos8 ~]#locate test_redis.log
[root@centos8 ~]#updatedb
[root@centos8 ~]#locate test_redis.log
/root/test_redis.log
[root@centos8 ~]#touch test_redis2.log
[root@centos8 ~]#locate test_redis2.log
[root@centos8 ~]#updatedb
[root@centos8 ~]#locate test_redis2.log
/root/test_redis2.log
[root@centos8 ~]#rm -f test_redis2.log
[root@centos8 ~]#locate test_redis2.log
/
root/test_redis2.log
[root@centos8 ~]#
⽰例
[root@centos8 ~]#locate -n 10 -ir '\.CONF$'
/backup/etc_f
/backup/etc_f
/backup/etc_f
/backup/etc_f
/backup/etc_f
/backup/etc_2021-04-01/f
/backup/etc_f
/
backup/etc_f
/backup/etc_f
/backup/etc_f
[root@centos8 ~]#
1.3 whereis
whereis命令只能⽤于程序名的搜索,⽽且只搜索⼆进制⽂件(参数-b)、man说明⽂件(参数-m)和源代码⽂件(参数-s)。如果省略参数,则返回所有信息。
whereis命令的使⽤实例:
[root@centos ~]#whereis grep
grep: /usr/bin/grep /usr/share/man/man1/ /usr/share/info/
[root@centos ~]#
1.4 which
which命令的作⽤是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第⼀个搜索结果。也就是说,使⽤which命令,就可以看到某个系统命令是否存在,以及执⾏的到底是哪⼀个位置的命令。
which命令的使⽤实例:
alias grep='grep --color=auto'
/usr/bin/grep
[root@centos ~]#
1.5 type
type命令其实不能算查命令,它是⽤来区分某个命令到底是由shell⾃带的,还是由shell外部的独⽴⼆进制⽂件提供的。如果⼀个命令是外部命令,那么使⽤-p参数,会显⽰该命令的路径,相当于which命令
type命令的使⽤实例:
# 系统会提⽰,cd是shell的⾃带命令(build-in)
[root@centos ~]#type cd
cd is a shell builtin
[root@centos ~]#
# 系统会提⽰,grep是⼀个外部命令,并显⽰该命令的路径。
[root@centos ~]#type grep
grep is aliased to `grep --color=auto'
[root@centos ~]#
# 加上-p参数后,就相当于which命令
$ type -p grep
2. find:实时查⼯具
find 是实时查⼯具,通过遍历指定起始路径下⽂件系统层级结构完成⽂件查
⼯作特点
查速度略慢
精确查(find /etc -name “passwd”)
实时查
查条件丰富
可能只搜索⽤户具备读取和执⾏权限的⽬录
格式
find[OPTIONS][查起始路径][查条件][处理动作]
查起始路径:指定具体搜索⽬标起始路径,默认为当前⽬录
查条件:指定的查标准,可以根据⽂件名、⼤⼩、类型、从属关系、权限等标准进⾏,默认为出指定路径下的所有⽂件
处理动作:对符合查条件的⽂件作出的操作,例如删除等操作,默认为输出⾄标准输出
注:查条件或者查标准,也称为表达式,由选项和测试组成,⽽测试的结果通常为布尔型(“true”,“false”)
2.1 指定搜索⽬录层级
参数说明
-maxdepth level最⼤搜索⽬录深度,指定⽬录下的⽂件为第1级
-mindepth level最⼩搜索⽬录深度
⽰例
.
├── mbr
├── redis3679
│├── redis3679.log
│├── redis3679.rdb
│└── f
├── redis3680
│├── redis3680.aof
│├── redis3680.rdb
│├── f
│└── redisdata
│└── redis3680_data
├── sum.sh
└── test.file
3 directories, 10 files
[root@centos8 data]#find /data -maxdepth 1 -mindepth 1
/
data/test.file
/data/sum.sh
/data/mbr
/data/redis3679
/data/redis3680
[root@centos8 data]#find /data -maxdepth 2 -mindepth 2
/data/f
/data/redis3679/redis3679.rdb
/data/redis3679/redis3679.log
/data/f
/data/redis3680/redis3680.aof
/
data/redis3680/redis3680.rdb
/data/redis3680/redisdata
[root@centos8 data]#find /data -maxdepth 3 -mindepth 3
/data/redis3680/redisdata/redis3680_data
[root@centos8 data]#
2.2 对每个⽬录先处理⽬录内的⽂件,再处理⽬录本⾝find查命令的使用
-depth
-d # warning: the -d option is deprecated; please use -depth instead, because the latter is a POSIX-compliant feature ⽰例
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论