一、locate文件查找工具
(一)locate特点:
1. 根据关键字搜索(模糊查找),只要文件名称包含这个关键字就可以搜索到
2. 根据数据库索引文件搜索,如果数据库的索引文件不存在则无法使用(需要执行updatedb命令来更新数据库索引文件)
[root@rhel9 cron]# locate passwd
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
3. locate不是实时查询,有可能有的文件明明存在但是无法查询到(要么就等待自己更新数据库索引,要么手动执行updatedb命令更新)
[root@rhel9 opt]# touch passwd-yutianedu
[root@rhel9 opt]# locate passwd-yutianedu
[root@rhel9 opt]#
4. 所有查找工具共同的特点,查找的目录必须要有r和x权限
优点:根据索引进行搜索,查询效率快
缺点:无法实时去搜索文件,只能根据索引搜索
常用选项:
-i 忽略关键字的大小写
-nx 列出指定n行
比如:文件非常的多,你只知道文件名包含的关键字,建议使用locate查询,因为查询速度快
二、find-文件查找工具
(一)find特点:
1.实时查询文件,精确查询 也可以进行模糊查询(支持各种通配符)
2. find工具可以在查找到文件的基础之上执行二次命令操作(比如搜索系统上所有以.swp结尾的文件,然后去删除掉)
3. find支持各种条件查询(根据文件名称查询文件、根据文件的inode编号查询文件、根据文件的权限查询文件、根据文件的拥有人/拥有组身份查询文件、根据文件的时间戳查询文件、根据目录的层级来查询文件...)
4. 所有查找工具共同的特点,查找的目录必须要有r和x权限
5.find查询的时候是遍历查询
(二)语法格式:find查询的目录查询的条件命令操作
find /home -name "zhangsan" -print :表示在/home目录下查询文件名是zhangsan的文件并且将其打印输出到屏幕上
默认情况下 -print就是默认的操作,表示打印输出
所以可以写成 find /home -name "zhangsan"
如果查询的目录不写,表示在当前目录下查找
find -name "zhangsan"
1.查询条件
(1)基于文件名和inode编号查询
基于文件名进行搜索(支持通配符号,注意如果采用了通配符 记得用引号包裹)
-name
-iname
基于文件inode编号搜索(用的少,一般是用来搜索硬链接文件的,因为硬链接文件的inode编号是一样的)
-inum
(2)基于文件的拥有人/拥有组身份查询
基于文件的拥有人身份查询
-uid
-user
基于文件的拥有组身份查询
-gid
-group
查询没有拥有人/没有拥有组的文件:不属于任何用户的文件:文件还存在,但是文件的拥有人或者拥有组已经被管理员删除了
-nouser
-nogroup
(3)基于文件大小查询
基于文件大小进行查询
-size
[root@rhel9 size]# ll -h
total 24M
-rw-r--r--. 1 root root 1.0M Mar 8 14:08 1M.txt
-rw-r--r--. 1 root root 3.0M Mar 8 14:08 3M.txt
-rw-r--r--. 1 root root 4.5M Mar 8 14:10 4.5M.txt
-rw-r--r--. 1 root root 4.0M Mar 8 14:09 4M.txt
-rw-r--r--. 1 root root 5.0M Mar 8 14:09 5M.txt
-rw-r--r--. 1 root root 6.0M Mar 8 14:09 6M.txt
-rw-r--r--. 1 root root 0 Mar 8 14:08 empty.txt
[root@rhel9 size]#find . -size +5M# 查询大于5M大小的文件,不包含5M 。是大于的意思
./6M.txt
[root@rhel9 size]#find . -size -5M# 查询小于5M大小的文件,不包含5M 是小于的意思
.
./empty.txt
./1M.txt
./3M.txt
./4M.txt
[root@rhel9 size]#find . -size 5M# 查询小于等于5M,大于4M的文件。包含的意思。 x-1 < x <=x
./5M.txt
./4.5M.txt
[root@rhel9 size]#find . -size -1M## 这里的意思是表示搜索空文件,如果要搜索小于1M的文件使用 -size 1M
./empty.txt
(4)基于文件类型查询
基于文件类型查询文件
-type x
x如下:
f 普通文件
b 块设备
c 字符文件
d 目录
l 链接文件
p 管道文件
s 套接字文件
(5)基于文件权限查询
基于文件权限查询
-perm [ / or - ] MODE
MODE: 精确匹配权限
/MODE: 任何一类(u,g,o)对象的权限中只要能一位匹配即可,属于或关系。以前用'+',rhel 7以后'/'替代
-MODE: 每一类对象都必须同时拥有指定权限,属于与关系
0:表示不关注(只针对/或者-的场景,只有在这类场景下0才表示不关注)
MODE表示文件权限:文件权限有数字和字母的表现方式,这里通常使用数字表示
# 1. 查找任何人有执行权限的文件(宽松)
find . -perm /111
# 2. 查找拥有人必须有读+写,拥有组必须有读(严格)
find . -perm -640
# 3. 查找权限恰好是 644 的文件(精确)
find . -perm 644
(6)基于文件时间戳查询
基于文件时间戳查询
access time
modify time
change time
选项:
- atime [+-] 时间:根据文件访问时间搜索
- mtime [+-] 时间:根据文件修改时间搜索
- ctime [+-] 时间:根据文件改动时间搜索(属性)
+7 表示7天以及7天之前的时间 相当于>=7
-7 表示7天之内的时间 相当于<
7 表示7-8天的时间(包含第7天) 相当于7<=x<8
-atime +7
-mtime +7
-ctime +7
time单位是天数
-amin +7
-mmin +7
-cmin +7
min单位是分钟
物理服务器运行了很久很久,服务器上的程序运行的时候是会产生一些临时和缓存数据文件的!
这些临时文件会占据存储空间,这些文件其实是可以释放掉的!
(7)基于逻辑组合类型查询:针对于多个条件来查询文件的话
-a:与 默认情况下,就是逻辑与
-o:或
-not,!:非
[root@rhel9 size]# find /usr/ -size +30k -size -50k -type f
优先级:() > ! > -a > -o(与数学运算类似)
# 错误示例:本意是查找 .txt 或 .log,且大小>1M
find . -name "*.txt" -o -name "*.log" -size +1M
# 实际解析:(.txt) OR (.log AND >1M) ← 不是想要的!
# 正确写法:用括号明确分组
find .\(-name "*.txt" -o -name "*.log"\)-size +1M
(8)基于目录层级查询
基于目录层级查询
-maxdepth n 最大深度 n 层(从起始目录算 0)
-maxdepth 2 最多往下走 2 层
-mindepth n 最小深度 n 层
-mindepth 2 至少走 2 层才开始匹配
比如说有一个目录,这个目录非常的庞大,如果直接通过rm的方式删除整个目录,其实效率比较低,会卡顿
我们推荐可以先进入到最里面的目录, 然后删除最里面目录的文件;退回到上一层级目录,然后再删除
find xxx -mindepth 9
2.在查找的文件基础上进行二次命令操作(动作)
操作:打印输出、查看详细信息(权限、大小)、删除、自定义命令操作
-print:打印输出查到的文件
-ls:列出查找到的文件的详细信息
-delete:删除查找到的文件。对于delete来说,如果删除的是目录,目录不为空,delete无法删除掉
-ok / -exec :在查找到的文件基础之上做二次命令,后面的命令是自己写的Linux命令
-ok 交互式
-exec 非交互式
格式:
[root@rhel9 opt]# find . -type f-execrm -rf{} \;
{} 表示前面查到的文件
\; 固定语法
案例:搜索/opt目录下,将没有其他人x权限的普通文件都加上x权限
[root@rhel9 opt]#find/opt/-type f! -perm-001-execchmodo+x{}\;
[root@rhel9 opt]# ll
total 8
-rw-r--r-x. 1 root root 1254 Mar 8 15:09 group
-rw-r--r-x. 1 root root 3326 Mar 8 15:09 passwd