大家好,我是“孤云幕雨”;祝大家中秋快乐,今天给大家带来的是《Linux文件查找命令》
一、locate:依赖于事先构建的索引
v 依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新数据库:updatedb
v 数据库配置文件:/var/lib/mlocate/mlocate.db
v 索引构建过程需要遍历整个根文件系统,极消耗资源
v 实时查找:遍历所有文件进行条件匹配
v 非实时查找:根据索引查找
v locate工作特点
Ü 模糊查找
Ü 优势:查找速度快
Ü 非实时查找(数据库查找)
v 只搜索用户具备读取和执行权限的目录
语法:locate 文件名
locate KEYWORD
locate [OPTION]... PATTERN...
选项:
-i:查找时,不区分大小写
-b:只匹配路径中的基名
-c:统计出共有多少个符合条件的文件
-n N:仅显示前N个匹配条目
注意:索引构建过程需要遍历整个根文件系统,极消耗资源
二、find 实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找
v find工作特点
Ü 查找速度慢
Ü 精确查找
Ü 实时查找
语法:find 查找路径 查找条件
find 查找路径 查找条件 处理动作
find [选项] ... 查找路径 查找条件 处理动作
选项:
-L: 遵循符号链接
-P:不遵循符号链接
-maxdepth LEVEL: 设置最大目录层级
-mindepth LEVEL: 设置最小目录层级
v 查找路径:指定具体目标路径;默认为当前目录
v 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
v 处理动作:对符合查找条件的文件做出的操作;默认输出至屏幕
查找条件
根据文件名查找(支持使用glob风格的通配符)
v -name FileName:根据文件名称进行查找
v -iname FileName:根据文件名进行查找,不区分字符大小写
v -depth: 从指定目录下最深层的子目录开始查找
v -regex:支持正则表达式;以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
[root@zhangdaifu ~]# find /etc -name network
/etc/sysconfig/network
/etc/rc.d/init.d/network
[root@zhangdaifu ~]# find /etc -maxdepth 3 -mindepth 3 -name network
/etc/rc.d/init.d/network
根据文件从属关系查找
根据文件属主查找
v -user UserName:查找属主为指定用户的文件
根据文件属组查找
v -group GroupName:查找属组为指定组的文件
根据UID查找
v -uid UID:查找属主为指定uid号的文件
根据GID查找
v -gid UID:查找属组为指定gid号的文件
查找没有属主属组的文件
v -nouser:查找没有属主的文件
v -nogroup:查找没有属组的文件
根据文件类型查找
v -type 文件类型(FILE_TYPE):指定文件类型进行查找
Ü 文件类型(FILE_TYPE)
F f:普通文件
F d:目录文件
F l:软链接文件
F b:块设备文件
F c:字符设备文件
F p:管道文件
F s:套接字文件
高级查找
组合条件查找
v -a:与;两个条件同时满足;默认(并且关系)
Ü 多个条件之间默认就是“并且”关系
v -o:或;两个条件满足一个即可(或者关系)
v -not或 !:非;条件取反
德.摩根定律
v 非A并且非B
Ü !A -a !B = !(A -o B)
v 非A或非B
Ü !A -o !B = !(A -a B)
根据文件系统查找
v -fstype FileSystem_type: 只寻找该文件系统类型下的文件或目录
根据文件大小查找
v 开区间:不包括
v 闭区间:包括
Ü (开区间)
Ü [闭区间]
v -size [+|-]#UNIT:根据指定文件大小进行查找;选项后可以加“+或-”加减号后加上数字,数字后面加单位,常用的单位有“k、M、G”;默认以字节为单位
Ü #UNIT: (#-1, #]
Ü -#UNIT:[0,#-1]
Ü +#UNIT:(#,oo)
Ü 半开半闭区间:#UNIT: (#-1, #],>#-1<=#
Ü 闭区间:#UNIT:[0,#-1],>0<=#-1
Ü 开区间:+#UNIT:(#,oo),>#
v -expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录
根据时间戳查找
以“天”为单位
v -atime [+|-]#:访问时间
大于等于#小于#+1
Ü #:[#, #-1),>=3<4
Ü -#:(#, 0], <#>0
Ü +#:(oo, #-1], --oo>#-1
Ü -:在N天之内(包括N本身)被访问过的文件
Ü +:在N天之前(不包含N本身)被访问过的文件
v -mtime:修改时间
v -ctima:改变时间
以“分钟”为单位
v -amin:访问时间
v -mmin:修改时间
v -cmin:改变时间
根据权限查找
v -perm [+|/|-] MODE:指定八进制权限位,查找对应的权限
Ü MODE:精确匹配
Ü 至少一类有 ! 所有都没有
Ü 所有都有 ! 至少一类没有
Ü {+|/}:任何一类用户(u、g、o)的权限中的任何一位(r、w、x)符合条件即满足(包含即为有,9位权限之间存在“或”关系;任何一位满足就行,隐藏着“或”关系)
# find / -perm +003
# 不关心属主属组的权限、查找其他人能写或能执行的权限;0为不考虑
# find ./ -perm /222 –ls
# 查找当前目录下,至少有一位用户有写权限的文件
Ü -:每一类用户(u、g、o)的权限中的每一位(r、w、x)同时符合条件即满足(9位权限之间存在“与”关系,隐藏着“与”关系)
666(包含,包含,包含)
766:符合
760:不符合
find / -not -perm 222
# 至少有一类用户没有写权限
find / -perm -003
# 不关心属主属组的权限、其他人需同时拥有w和x权限极为符合
注:在RHEL 7/CentOS 7上“+”被废掉,被替换成“/”
根据文件新旧查找
v -newer
Ü 选项后+文件名+文件类型;查找比指定文件新的文件
Ü 选项前+逻辑非+文件类型;查找比指定文件旧的文件
Ü 选项后+文件1+逻辑非+选项+文件2+文件类型;查找比文件1新,比文件2旧的文件
根据Inode查找
v -inum INODE:根据Inode进行查找
v -samefile NAME:查找相同Inode的文件
v 根据Inode删除文件
Ü 当文件名太复杂不好删除时,可以根据Inode将其删除
find . -inum INODE -print -exec rm {} -rf \;
find . -inum INODE -print -exec rm -rf {} \;
根据文件被链接的次数进行查找
v -links N:查找被[硬]链接N次的文件
处理动作
v -print:默认的动作;将查找到的内容输出到标准输出(屏幕)
v -ls:类似于对查找到的文件执行ls –l命令
v -delete:删除查找到的文件;操作有风险,确认需谨慎
v -fprint /PATH/TO/SOMEFILE:将查找到的文件保存到指定文件中,如果文件不存在则创建之
v -fls /PATH/TO/SOMEFILE:查把查找到的所有文件的长格式信息保存至指定文件中
v -ok COMMAND {} \; :对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认
v -exec COMMAND {} \; :对查找到的每个文件执行由COMMAND指定的命令;无需用户确认!
v {}:用于引用查找到的文件名称自身
注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;有些命令不能接受过多参数,此时命令执行可能会失败
另一种方式可规避此问题
语法格式:find | xargs COMMAND
find命令练习
find命令练习 (1)
1、找出/tmp目录下属主为非root的所有文件
# find /tmp -not -user root
2、找出/tmp目录下文件名中不包含fstab字符串的文件
# find /tmp -not -iname '*fstab*'
3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件
# find /tmp -not \( -user root -o -iname '*fstab*' \)
4、找出当前系统下文件名带有~的文件
# find / -name *\~*
find命令练习 (2)
1、查找/var目录下属主为root,且属组为mail的所有文件或目录
# find /var -user root -group mail
2、查找/usr目录下不属于root,bin或zhangdaifu的所有文件或目录用两种方法
# find /usr -not -user root -not -user bin -not -user zhangdaifu
find /usr -not \( -user root -o -user bin -o -user zhangdaifu \)
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是zhangdaifu用户的文件或目录
# find /etc -mtime -7 -not \( -user root -o -user zhangdaifu \)
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录
# find / \( -nouser -a -nogroup \) -a -atime -7
5、查找/etc目录下大于1M且类型为普通文件的所有文件
# find /etc -type f -size +1M
6、查找/etc目录下所有用户都没有写权限的文件
# find /etc -not -perm /222 -type f
7、查找/etc目录至少有一类用户没有执行权限的文件
# find /etc -not -perm -111 -type f
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件
# find /etc/init.d/ -perm -113 -type f
find /etc/init.d/ -type f -perm -111 -a -perm -002
文件系统查找
findfs 通过标签或UUID查找文件系统
语法:findfs LABEL=label
findfs UUID=uuid
根据UUID进行查找
[root@localhost ~]# findfs UUID=6a7eb833-5bd7-4e73-8766-4de1607ecb90
/dev/sda5
根据卷标进行查找
[root@localhost ~]# findfs LABEL=DATA_DISKS
/dev/sdb