Linux 文件查找

庆云3年前技术文章1440

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



相关文章

Hive中小表与大表关联(join)的性能分析

经常看到一些Hive优化的建议中说当小表与大表做关联时,把小表写在前面,这样可以使Hive的关联速度更快,提到的原因都是说因为小表可以先放到内存中,然后大表的每条记录再去内存中检测,最终完成关联查询。...

crs启动报错CRS-4124 CRS-4000

现象:crs启动报错CRS-4124 CRS-4000 CRS-0715# crsctl start crsCRS-4124: Oracle High Availability Services st...

rancher上kube-prometheus部署报错处理

rancher上kube-prometheus部署报错处理

问题描述rancher 上安装kube-prometheus,版本:8.3.9  ,Chart 仓库:bitnami 服务 pod: prometheus-kube-prometheus-promet...

Keepalived安装部署

Keepalived安装部署

安装keepalivedyum 安装keepalivedyum install keepalivedkeepalived.conf配置文件进行调整,其中state设置主备状态,interface设置对...

Flink sql 集成hive metastore-测试

Flink sql 集成hive metastore-测试

FQA1、如何不使用catalog命令,默认进入hive catalog在sql-client-defaults.yaml中添加以下配置2、如何使用mysql使用./bin/sql-client.sh...

Dockerfile

Dockerfile

一、什么是镜像?镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。根据上图...

发表评论    

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