Linux 文件查找

庆云2年前技术文章511

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



相关文章

Dockerfile编写指南

Dockerfile编写指南

一、背景  在k8s提出抛弃docker,拥抱其他的cri插件的情况下,为什么还有这篇指南呢?首先Dockerfile作为容器打包的标准,已经存在了很多年了。其中的编写技巧到现在也是一直延续的,所以并...

Flinksql Kafka 接收流数据并打印到控制台

Flinksql Kafka 接收流数据并打印到控制台

本文目的使用Flink SQL创建一个流处理作业,将来自Kafka主题"dahua_picrecord"的数据写入到另一个表”print_table”控制台中。使用sql-client前 需要启动ya...

Prometheus PromQL语法

一、PromQL语法1.1、数据类型PromQL 表达式计算出来的值有以下几种类型:瞬时向量 (Instant vector)区间向量 (Range vector)标量数据 (Scalar)字符串 (...

Flume使用案例之实时读取本地文件到HDFS

Flume实时读取本地文件到HDFS1.  创建flume-hdfs.conf文件# 1 agenta2.sources = r2a2.sinks = k2a2.channels = c2 # 2 s...

CDH实操--集群关闭Kerberos

CDH实操--集群关闭Kerberos

1、关掉整个集群2、zookeeper配置搜索kerberos,将enable Kerberos配置关掉3、hdfs配置在输入框中填入[hadoop.security.auth] 进行搜索将安全身份认...

ES运维(四)扩容方式迁移

ES运维(四)扩容方式迁移

1 迁移概述本次模拟es在线迁移方式:集群扩容-->数据迁移-->老节点下线-->服务重启刷新配置。 中间master替换的时候会有短暂的不可用。 另外业务测需注意:老节点下线前...

发表评论    

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