linux文件查找--locate和find命令详解

在文件系统上查找符合条件的文件

文件查找:
  1.非实时查找(数据库查找):locate
  2.实时查找: find

应用:生产环境中查找到系统中占用磁盘空间较大且时间比较久的大日志文件,对这个较大的日志文件做处理(删除移走等),防止它占用更多的磁盘空间。

locate概述

locate概述
  1.locate查询依赖于系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db
  2.索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
  3.索引构建过程需要遍历整个根文件系统,很消耗资源
  4.locate和updatedb命令来自于mlocate包

locate可以快速的定位文件的位置,它的搜索速度非常快。基本上一回车就能立即找到(无论文件有多少,locate都能快速的找到)。

为什么locate的查找速度这么快?
locate已经事先把所有磁盘文件的信息建立在一个索引数据库里“/var/lib/mlocate/mlocate.db”,这个索引数据库已经存放了文件的列表和路径。
在这里插入图片描述
应用:tomcat的catalina.out日志文件,这个文件动不动几天就打印了好几百兆的日志内容,占据了大量的磁盘空间。现在需要快速找到这个日志文件,将其清理或移走。
在这里插入图片描述
上图是公司测试环境的catalina.out日志文件,短短几天就从0K打印了109M的内容了,之前我找这个日志文件都是一级一级目录的去cd,这样速度很慢。使用了locate后,命令后面直接跟文件名,一回车就找到了。

locate的缺点:mlocate.db数据库不是实时更新的,如果新增了一个文件,则需要使用“updatedb”更新“mlocate.db”数据库才可以找到新增的文件。也就是mlocate.db会有一定的滞后性。

安装mlocate

在这里插入图片描述
安装完mlocate包后,就可以执行updatedb了
在这里插入图片描述

locate格式

格式:
  locate [OPTION]... [PATTERN]...

常用选项
  -i     不区分大小写的搜索
  -n  N  只列举前N个匹配项目
  -r     使用基本正则表达式

范例:

#搜索名称或路径中包含"“conf"的文件
locate conf

#使用Regex来搜索以".conf"结尾的文件
locate -r '\.conf$'

在这里插入图片描述

locate特点

locate特点
  1.查找速度快
  2.模糊查找
  3.非实时查找(滞后性)
  4.搜索的是文件的全路径,不仅仅是文件名
  5.可能只搜索到用户具备读取和执行权限的目录
  6.适合查找不经常变更的文件,如系统配置文件,日志文件等

find概述

find是实时查找工具,通过遍历指定路径完成文件查找。

find 是 Linux 中强大的搜索命令,不仅可以按照文件名搜索文件,还可以按照权限、大小、时间、inode 号等来搜索文件。但是 find 命令是直接在硬盘中进行搜索的,如果指定的搜索范围过大,find命令就会消耗较大的系统资源,导致服务器压力过大。所以,在使用 find 命令搜索时,不要指定过大的搜索范围。

find特点

find工作特点
  1.查找速度略慢(在磁盘上挨个的找)
  2.精准查找
  3.实时查找
  4.查找条件丰富
  5.可能只搜索用户具备读取和执行权限的目录

格式

find [OPTION]...[查找路径][查找条件][处理动作]
find 命令的基本信息如下:
  命令名称:find。
  英文原意:search for files in a directory hierarchy.
  所在路径:/bin/find。
  执行权限:所有用户。
  功能描述:在目录中查找文件。
  查找路径: 指定具体目标路径; 默认为当前目录
  查找条件: 指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
  处理动作: 对符合条件的文件做操作,默认输出至屏幕

指定搜索目录层级

-maxdepth level  最大搜索目录深度,指定目录下的文件为第1级
-mindepth level  最小搜索目录深度

f范例:查找/etc目录下的最深2级最浅2级目录

find /etc -maxdepth 2 -mindepth 2
#因为是以/etc为目标,所以/etc下的dnf是第一级目录,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对每个目录先处理目录内的文件,再处理目录本身

find /data/test/ -depth

在这里插入图片描述
在这里插入图片描述

文件名和inode查找

-name "文件名称"        支持使用glob,如:*, ?, [], [^], 通配符要加双引号引起来
-iname "文件名称"       不区分字母大小写
-inum n                按inode号查找
-samefile name         相同inode号的文件
-links n               链接数为n的文件
-regex "“PATTERN""     以PATTERN匹配整个文件路径,而非文件名称

在这里插入图片描述
使用通配符时,一定要使用双引号。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按inode号查找
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
find / -samefile
在这里插入图片描述
正则表达式搜索,以conf结尾的文件
在这里插入图片描述

属主、属组查找

-user USERNAME     查找属主为指定用户(UID)的文件
-group GRPNAME     查找属组为指定组(GID)的文件
-uid UserID        查找属主为指定的UID号的文件
-gid GroupID       查找属组为指定的GID号的文件
-nouser            查找没有属主的文件
-nogroup           查找没有属组的文件

在这里插入图片描述

文件类型查找

-type TYPE

TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s: 套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件

范例:查找/home下的普通文件
在这里插入图片描述
查找/home下的目录
在这里插入图片描述
在这里插入图片描述

空文件或目录查找

-empty

在这里插入图片描述

组合条件

与: -a , 默认多个条件是与关系,所以可以省略-a
或: -o
非: -not !

范例:查看/etc/下的目录或者链接文件
在这里插入图片描述
在这里插入图片描述

找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) -ls

排除目录

prune: v. 修剪,修整;删除,削减

查找/etc/下,除/etc/security目录的其它所有.conf后缀的文件
find /etc -path '/etc/security' -a -prune -o -name "*.conf"

查找/etc/下,除/etc/security和/etc/systemd, /etc/dbus-1三个目录的所有.conf后缀的文件
find /etc \( -path "/etc/security" -o -path "/etc/systemd" -o -path "/etc/dbus-1" \) -a -prune -o -name "*.conf"

排除/proc和/sys目录
find / \( -path "/sys" -o -path "/proc” \) -a -prune -o -type f -a -mmin -1

文件大小查找

-size [+|-]#UNIT       常用单位:k,M,G,c (byte,注意大小写敏感
#UNIT:                 表示(#-1,#],   如:6k 表示(5k,6k]
-#UNIT                 表示[O,#-1],   如:-6k 表示[O,5k]
+#UNIT                 表示(#, ∞) ,   如:+6k 表示(6k, ∞)

find -size [+|-]

常用单位:k,m,G,c(byte) ,注意大小写敏感
应用:系统里有一个大约210M的catalina.out的日志文件
在这里插入图片描述
在这里插入图片描述

时间戳查找

linux下,一个文件有三种时间:
  1.访问时间:atime  对文件进行一次读操作,它的访问时间就会改变,cat、more等操作。
  2.修改时间:mtime  文件的内容被最后一次修改的时间。
  3.状态时间:ctime  文件的状态被改变的时候,状态时间就会随之改变。
find -atime [+|-]num
num  表示[num,num+1)
+num 表示[num+1,∞]
-num 表示[0,num)

以“分钟”为单位
-amin
-mmin
-cmin

find ./ -ctime -5

在这里插入图片描述

处理动作

-print:  默认的处理动作,显示至屏幕
-ls:     类似于对查找到的文件执行“ls -dils”命令格式输出
-fls file: 查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
-delete:    删除查找到的文件,慎用!
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
备份配置文件,添加.orig这个扩展名
find -name ".conf" -exec cp {} {}.orig  \;

提示删除存在时间超过3天以上的joe的临时文件
find / tmp -ctime +3 -user joe -ok rm {} \;

在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;

查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data -type f -perm 644 -name "*.sh" -exec chmod 755 {} \;

-print

在这里插入图片描述

-delete

找到文件,将之删除
在这里插入图片描述

-fls file

在这里插入图片描述

-ok COMMAND {} ;

交互式的方式
在这里插入图片描述

-exec COMMAND {} ;

非交互式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参数替换xargs

由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔成为参数

另外,许多命令不能接受过多参数,命令执行可能会失败,xargs可以解决

注意:文件名或者是其他意义的名词内含有空格符的情况

find经常和xargs命令进行组合,形式如下:

find | xargs COMMAND

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

find /data/test -name "*.txt" |xargs ls -Sl

在这里插入图片描述

批量创建和删除用户

echo user{1..10} |xargs -n1 useradd
echo user{1..100} |xargs -n1 userdel -r

查找有特殊权限的文件,并排序

find /bin/ -perm /7000 | xargs ls -Sl 
#此命令和上面有何区别?
find /bin/ -perm -7000 | xargs ls -Sl

在这里插入图片描述
在这里插入图片描述

以字符nul分隔(xargs默认使用空格做分隔符,如果有的文件就是有空间的文件名,那就会报错)

find -type f -name "*.txt" -print0 | xargs -0 rm

并发执行多个进程

seq 100 |xargs -i -P10 wget -P / data  http://10.0.0.8/{}.html

并行下载bilibi7i视频

yum -y install python3-pip 
pip3 install you-get
seq 60 | xargs -i -P3 you-get https://www.bilibili.com/video/Bv14K411w7UF?p={}
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值