Linux 文件查找

庆云1年前技术文章299

1、locate 命令

locate 命令搜索不经常改变的文件如配置文件等,非实时查找(数据库查找),查询系统上预建的文件索引数据库(/var/lib/mlocate/mlocate.db)。

locate 命令依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)。

注意:locate 命令索引构建过程需要遍历整个根文件系统,极消耗资源!

优点:

  • 查找速度快

  • 模糊查找

  • 非实时查找

  • 搜索的是文件的全路径,不仅仅是文件名

  • 可只搜索用户具备读取和执行权限的目录

1.1 安装

$ yum install mlocate -y
$ updatedb

1.2 语法

locate [option] keyword
  -i     不区分大小写的搜索
  -n N   只列举前 N 个匹配项目
  -r     使用正则表达式

1.3 实例

$ locate myapp
/root/datum/packages/myapp.tar

$ locate -r 'photon.tar$'
/root/datum/packages/goharbor-nginx-photon.tar
/root/datum/packages/goharbor-redis-photon.tar
/root/datum/packages/goharbor-registry-photon.tar


2、find 命令

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

特点:

  • 查找速度慢

  • 精确查找

  • 实时查找

  • 可能只搜索用户具备读取和执行权限的目录(搜索考虑权限问题)

2.1 语法

find [OPTION]… [查找路径] [查找条件] [处理动作]
  查找路径:指定具体目标路径;默认为当前目录
  
  查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件。
    指搜索层级:
      -maxdepth level 最大搜索目录深度,指定目录为第一级
      -mindepth level 最小搜索目录深度

  处理动作:对符合的文件做操作,默认输出至屏幕
    -print:默认的处理动作,显示至屏幕
    -ls:类似于对查找到的文件执行 "ls -l" 命令
    -delete:删除查找到的文件
    -fls file:查找到的所有文件的长格式信息保存至指定文件中
    -ok COMMAND {} \;对查找到的每个文件执行由 COMMAND 指定的命令。对于每个文件执行命令之前,都会交互式要求用户确认。
    -exec COMMAND {} \; 对查找到的每个文件执行由 COMMAND 指定的命令。
      {}:用于引用查找到的文件名称自身
      find 传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令。

2.2.1 根据文件名和 inode 查找

-name "文件名称":支持使用 glob
-iname "文件名称":不区分字母大小写
-inum n:按 inode 号查找
-samefile name:相同 inode 号的文件
-links n:链接数为 n 的文件
-regex "PATTERN":以 PATTERN 匹配整个文件路径字符串,而不仅仅是文件名称

2.2.2 根据属组属主查找

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

2.2.3 根据文件类型查找

-type TYPE:
  f:普通文件
  d:目录文件
  l:符号链接文件
  s:套接字文件
  b:块设备文件
  c:字符设备文件
  p:管道文件
空文件或目录
-empty

2.2.4 组合条件、德摩根定律

组合条件:
  与:-a
  或:-o
  非:not,!
德摩根定律:
  (非 A)或(非 B)= 非(A 且 B)
  (非 A)且(非 B)= 非(A 或 B)

2.2.5 根据文件大小查找

-size [+|-]#UNIT     # 按单位搜索,搜索出来的并不是精确的
  常用单位:k,M,G,c(byte)
  #UNIT: (#-1,#]
    如:6k 表示(5k,6k]
  -UNIT: [0,#-1]
    如:-6k 表示[0,5k]
  +UNIT: (#,00)
    如:+6k 表示(6k,00)

2.2.6 根据时间戳查找

以 "天" 为单位:
-atime [+|-]#
  -#:[0,#) #:[#,#+1) +#:[#+1,00]-mtime -ctime
以 "分钟" 为单位:
-amin -mmin -cmin

2.2.7 根据权限查找

-prem [/|-]MODE
  MODE:精确权限匹配
    # find -prem 755 会匹配权限模式恰好是 755 的文件
  /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+从 centos7 开始淘汰
    # find /data/ -perm /666 -ls    # 三者之间是或的关系
  -MODE:每一类对象都必须同时拥有指定权限,与关系
  /和-的时候,0 表示不检查 1 表示检查(二进制);-是交集,/是并集
  只要当每个人有写权限时,find -perm +222 就会匹配
  只有当每个人都有写权限时,find -perm -222 才会匹配
  只有当其他人(other)有写权限时,find -prem -002 才会匹配

2.2 实例

$ find /etc/ -name passwd                # 查找/etc/目录下名为 passwd 的文件
/etc/passwd
/etc/pam.d/passwd

$ find /etc/ -maxdepth 1 -name passwd    # maxdepth 指定最大深度,mindepth 相反指定最小深度
/etc/passwd

$ find /data/ -name f1                   # 搜索/data 目录下文件名为 f1 的文件,也可以使用 "*f1" 指包含 f1 的文件名(通配符)

$ find /home -user yang                  # 查找属主为 yang 的文件

$ find /home -nouser -o -nogroup         # -o 或者

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

排除目录示例:

"查找/etc/下,除/etc/sane.d 目录的其他所有.conf 后缀的文件"
$ find /etc -path '/etc/asne.d' -a -prune -o -name "*.conf"    # -path '/etc/asne.d' -a -prune 如果是这个目录剪切掉

"查找/etc/下,除/etc/sane.d 和/etc/fonts 两个目录的所有.conf 后缀的文件"
$ find /etc \( -path '/etc/sand.d' -o -path '/etc/fonts' \) -prune -o -name "*.conf"    # \( -path "/etc/sane.d" -o -path "/etc/fonts" \)    # 过滤多个目录
 
"查找/data/目录下 的空文件夹"
$ find /data -type d -empty
$ find /home -type d -maxdepth 1
$ find /data/ -empty -type f -ls    # 查找目录下空文件,-ls 列出长属性

组合条件、德摩根定律:

$ find /data/ ! \( -empty -o -type f \)    # 查找/data目录下不是空文件

常用功能:

"备份配置文件,添加.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 {} \;

"查看/home 的目录"
$ find /home -type d -ls



相关文章

SQL隐式转换导致索引失效_字符集不一致

3.字符集不一致导致索引失效示例 SQL 如下,通过查看执行计划发现 XXX 和 XXXX 表在进行表关联的时候没有走索引,导致 SQL 扫描数量较大。核实表结构发现表关联对应列都存在索引,最终查看字...

Spark优化之配置参数

Spark优化之配置参数

一、资源参数优化所谓的Spark资源参数调优,其实主要就是对Spark运行过程中各 个使用资源的地方,通过调节各种参数,来优化资源使用的效率,从而提升Spark作业的执行性能。以下参数就是Spark中...

Flink-CDC部署及测试

Flink-CDC部署及测试

1、CDC简介CDC (Change Data Capture) ,在广义的概念上,只要能捕获数据变更的技术,都可以称为 CDC 。但通常我们说的CDC 技术主要面向数据库(包括常见的mysql,Or...

Spark on yarn 动态资源配置

Spark on yarn 动态资源配置

1、背景spark on yarn 的环境下,开源的spark 默认是关闭动态分配申请资源的。每次提交时,需要手动定义--num-executors 的数量。为了提交任务方便,需要开启动态分配资源sp...

系统RDSCPU打满问题分析报告

系统RDSCPU打满问题分析报告

1. 问题概述在2023年9月01日09点13分,玳数运维组侧接收到业务侧反馈系统响应缓慢,与此同时运维群内新系统RDS 发出CPU打满的告警,告警通知如下: 2. 问题分析a. 数据库会话管理核查玳...

大数据平台袋鼠云托管运维与自建集群运维对比

对比维度袋鼠云托管运维自建hadoop集群运维成本根据业务需求定制架构,预估业务增涨合理规划,低成本高性价比需自行预估资源,规划架构性能大量集群优化经验,根据业务需求进行点对点优化采用开源社区版本,性...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。