Linux 文件查找
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