在文件系统上查找符合条件的文件
文件查找:1.非实时查找(数据库查找):locate2.实时查找: find
应用:生产环境中查找到系统中占用磁盘空间较大且时间比较久的大日志文件,对这个较大的日志文件做处理(删除移走等),防止它占用更多的磁盘空间。
文章目录
- locate概述
- 安装mlocate
- locate格式
- locate特点
- find概述
- find特点
- 指定搜索目录层级
- 对每个目录先处理目录内的文件,再处理目录本身
- 文件名和inode查找
- 属主、属组查找
- 文件类型查找
- 空文件或目录查找
- 组合条件
- 排除目录
- 文件大小查找
- find -size [+|-]
- 时间戳查找
- find ./ -ctime -5
- 处理动作
- -delete
- -fls file
- -ok COMMAND {} \;
- -exec COMMAND {} \;
- 参数替换xargs
- 批量创建和删除用户
- 查找有特殊权限的文件,并排序
- 并发执行多个进程
locate概述
locate概述1.locate查询依赖于系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db2.索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库3.索引构建过程需要遍历整个根文件系统,很消耗资源4.locate和updatedb命令来自于mlocate包
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 TYPETYPE可以是以下形式:
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 {} \;
-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={}