文件查找find,locate

非实时查找(数据库查找):locate

locate特点:

  • 查找速度快
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名

locate用法

-i 不区分大小写的搜索

-n N 只列举前N个匹配项目

-r 使用基本正则表达式
搜索名称或路径中包含"conf"的文件

locate conf

#使用Regex来搜索以".conf"结尾的文件

locate -r '\.conf$'

复制代码
[root@centos8 ~]#touch test2.log
[root@centos8 ~]#locate test2.log
[root@centos8 ~]#updatedb             #更新数据库
[root@centos8 ~]#locate test2.log
/root/test2.log

实时查找:find

find特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 查找条件丰富
  • 可能只搜索用户具备读取和执行权限的目录

指定搜索目录层级

复制代码
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度

跟据文件和inode查找

-name "文件名称" #支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来

-iname "文件名称" #不区分字母大小写

-inum n #按inode号查找

-samefile name #相同inode号的文件

-links n #链接数为n的文件

-regex "PATTERN" #以PATTERN匹配整个文件路径,而非文件名称

根据所属主,组查找

-user USERNAME #查找属主为指定用户(UID)的文件

-group GRPNAME #查找属组为指定组(GID)的文件

-uid UserID #查找属主为指定的UID号的文件

-gid GroupID #查找属组为指定的GID号的文件

-nouser #查找没有属主的文件

-nogroup #查找没有属组的文件

根据文件类型查找

-type 命令告诉 find 在找到的每个文件上执行后面的 xx 命令。

TYPE可以是以下形式:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

#查看/home的目录

find /home --type d -ls

与或非

与:-a ,默认多个条件是与关系,所以可以省略-a

或:-o

非:-not !

复制代码
#查找/etc/下,除/etc/security目录的其它所有.conf后缀的文件
find /etc -path '/etc/security' -a -prune -o -name "*.conf"

根据文件大小来查找

-size [+|-]#UNIT #常用单位:k, M, G,c(byte),注意大小写敏感

#UNIT: #表示(#-1, #],如:6k 表示(5k,6k]

-#UNIT #表示[0,#-1],如:-6k 表示[0,5k]

+#UNIT #表示(#,∞),如:+6k 表示(6k,∞)

复制代码
find / -size +10G
[root@centos8 ~]#find / -size +10G
/proc/kcore
find: '/proc/25229/task/25229/fd

find /etc -type f -size +1M -ls   #普通文件,且大于1M

跟权限查找

find -perm 755 会匹配权限模式恰好是755的文件

只要当任意人有写权限时,find -perm /222就会匹配

只有当每个人都有写权限时,find -perm -222才会匹配

只有当其它人(other)有写权限时,find -perm -002才会 匹配

处理动作

-print:默认的处理动作,显示至屏幕

-ls:类似于对查找到的文件执行"ls -dils"命令格式输出

-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file

-delete:删除查找到的文件,慎用!

-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会

交互式要求用户确认

-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令

{}: 用于引用查找到的文件名称自身

复制代码
#把etc里面后缀是.conf的后面加上.orig
find /etc/ -name "*.conf" -exec cp {} {}.orig \;
-name "*.conf" 用于找到以".conf"结尾的文件。
-exec cp {} {}.orig \; 用于将找到的文件复制到相同目录并加上".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 {} \;

根据时间戳

#以"天"为单位

-atime [+|-]#

#表示[#,#+1)

+# #表示[#+1,∞]

#根据权限查找

-# #表示[0,#)

-mtime #选项用于搜索文件的修改时间文件目录,单位以24小时计算;

-ctime #用于搜索文件的改变时间文件或目录,单位以24小时计算

文件元数据(如权限、所有者、链接等)被修改的时间

#以"分钟"为单位

-amin #查找在指定时间曾被存取过的文件或目录,单位以分钟计算

-mmin #查找在指定时间曾被更改过的文件或目录,单位以分钟计算

-cmin #查找在指定时间之时被更改过的文件或目录;

复制代码
find /var ! \( -user root -o -user postfix \) -mtime -7 -ls  不是 7天访问

xargs 给其他命令传递参数的一个过滤器

复制代码
cat test.txt | xargs  多行输入单行输出:
cat test.txt | xargs -n3  -n 选项 多行输出:
a b c
d e f
g h i
j k l
echo "nameXnameXnameXname" | xargs -dX  -d 选项 可以自定义一个定界符:
  name name name name
#用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:
find . -type f -name "*.log" -print0 | xargs -0 rm -f
 
#统计一个源代码目录中所有 php 文件的行数:
find . -type f -name "*.php" -print0 | xargs -0 wc -l
 
#查找所有的 jpg 文件,并且压缩它们:
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
 
 
#结合 -t 选项可以打印出 xargs 执行的命令
ls | xargs -t -I{} echo {}
 
#-p 选项会在执行每一个命令时弹出确认,当你需要非常准确的确认每一次操作时可以使用 -p 参数,比##如,查找当前目录下 .log 文件,每一次删除都需要确认:
find . -maxdepth 1 -name "*.log" | xargs -p -I{} rm {}

多行输入单行输出:

相关推荐
不知几秋1 小时前
数字取证-内存取证(volatility)
java·linux·前端
珊珊而川3 小时前
ChatPromptTemplate创建方式比较
服务器·langchain
欧先生^_^4 小时前
Linux内核可配置的参数
linux·服务器·数据库
若风的雨5 小时前
【deekseek】P2P通信路由过程
服务器·网络协议·p2p
海尔辛5 小时前
学习黑客5 分钟读懂Linux Permissions 101
linux·学习·安全
Python私教5 小时前
征服Rust:从零到独立开发的实战进阶
服务器·开发语言·rust
王RuaRua6 小时前
[数据结构]5. 栈-Stack
linux·数据结构·数据库·链表
曼岛_6 小时前
[架构之美]linux常见故障问题解决方案(十九)
linux·运维·架构
tan180°6 小时前
Linux进程信号处理(26)
linux·c++·vscode·后端·信号处理
大神的风范6 小时前
从0开始学linux韦东山教程第三章问题小结(4)
linux·服务器