Linux搜索---find
find搜索
find 命令的核心功能是在指定的目录路径下,递归地搜索文件和目录,并且可以根据多种条件对搜索结果进行筛选,还能对符合条件的文件和目录执行特定操作。
一、基础语法结构
find [起始目录] [匹配条件] [执行操作]
# 基本示例
find ~/Documents -name "*.pdf" -exec ls -lh {} \;
二、核心匹配条件详解
1. 文件名匹配
参数 | 功能描述 | 示例 |
---|---|---|
-name | 精确文件名匹配 | find /etc -name "nginx.conf" |
-iname | 不区分大小写匹配 | find . -iname "README" |
-regex | 正则表达式匹配 | find . -regex ".*\.\(jpg|png\)$" |
通配符对照表:
? → 匹配单个字符(除路径分隔符)
* → 匹配任意长度字符
[] → 字符集合(如[a-z0-9])
2. 文件类型筛选
find /dev -type c # 字符设备文件
find . -type d -empty # 空目录
find ~ -type l # 符号链接
type参数对照:
f → 普通文件
d → 目录
l → 符号链接
b → 块设备
c → 字符设备
s → 套接字
p → 命名管道
3. 时间维度搜索
# 修改时间(mtime)
find /var/log -mtime +30 # 30天前修改过的文件
find /backup -mmin -60 # 60分钟内修改过的文件# 访问时间(atime)
find /home -atime -7 # 7天内被访问过的文件# 创建时间(ctime)
find . -ctime 0 # 24小时内创建的文件
4. 文件大小筛选
find / -size +1G # 大于1GB的文件
find . -size -500k # 小于500KB的文件
find /tmp -size +10M -size -100M # 10MB到100MB之间
单位对照表:
c → bytes
k → kilobytes (1024 bytes)
M → megabytes
G → gigabytes
三、高级组合技巧
1. 逻辑运算符
对比其他逻辑符
操作符 | 含义 | 示例 | 作用 |
---|---|---|---|
-a | 逻辑与(AND) | -name "a" -a -size +1M | 同时满足名称和大小条件的文件 |
-o | 逻辑或(OR) | -name "a" -o -name "b" | 满足名称是 “a” 或 “b” 的文件 |
! | 逻辑非(NOT) | ! -name "*.tmp" | 排除所有 .tmp 文件 |
# AND组合(默认)
find . -name "*.tmp" -size +1M# OR条件
find / \( -name "*.log" -o -name "*.out" \)# NOT排除
find ~/ ! -user $(whoami)
⚠️ 括号转义**
\( ... \)
** 的必要性
\( ... \)
括号用于将多个条件组合成一个整体(需转义为\(
和\)
避免 Shell 误解析)
如果直接写成-name "*.log" -o -name "*.out"
而不加括号,find
的解析优先级可能导致逻辑错误。转义括号\(
和\)
是必须的,用于明确条件分组。
补充:
-user
选项:在 find 命令里,-user 属于一个测试选项,其用途是依据文件的所有者来筛选文件。
find ~/ ! -user $(whoami)
-user $(whoami)
:这里的 $(whoami) 会被替换成当前登录用户的用户名,-user 选项会检查文件的所有者是否为当前用户。
2. 深度控制
find /var -maxdepth 2 -name "*.conf" # 限制搜索层级
find . -mindepth 3 -type f # 从第3层开始搜索
3. 权限过滤
find /etc -perm 644 # 精确权限匹配
find . -perm /u=x # 用户有执行权限
find ~ -perm -g=w # 组用户有写权限
四、动作处理指令
1. 基础操作
# 简单输出
find . -print # 默认动作,可省略
find /tmp -ls # 显示详细信息# 删除操作
find /tmp -name "core.*" -delete
2. -exec 执行命令
-exec
是find 命令的一个选项,用于指定对查找到的每个文件或目录执行的命令。当 find 命令找到符合条件的文件或目录时,会将这些文件或目录作为参数传递给 -exec 后面的命令。
特殊格式说明:
{} → 匹配到的文件名占位符
\; → 命令终止符(必须转义)
-execdir → 在文件所在目录执行
# 标准格式
find [path] [conditions] -exec command {} \;# 文件批量重命名
find . -name "*.jpg" -exec rename 's/IMG/Photo/' {} \;# 结合xargs处理
find /log -name "*.log" -print0 | xargs -0 rm
\;
含义:-exec 选项的结束标志,用于告诉 find 命令 -exec 后面的命令到此结束。注意,; 在 shell 中有特殊含义,因此需要使用反斜杠 \ 进行转义,以避免被 shell 误解。
1.详细解释find . -name "*.jpg" -exec rename 's/IMG/Photo/' {} \;
rename
是一个用于批量重命名文件的命令。's/IMG/Photo/'
是 rename 命令使用的替换规则,它采用的是 Perl 风格的正则表达式替换语法。具体来说:s
表示替换操作(substitute)。/IMG/Photo/
中,IMG
是要被替换的字符串,Photo
是替换后的字符串。也就是说,rename 命令会将文件名中所有的 IMG 替换为 Photo。
2.详细解释 find /log -name "*.log" -print0 | xargs -0 rm
此命令的主要功能是在 /log
目录及其子目录中查找所有扩展名为 .log
的文件,并将这些文件删除。
1. find
命令部分
find
:这是一个用于在文件系统中搜索文件和目录的强大工具。/log
:指定了搜索的起始路径,即从/log
目录开始,递归地搜索其所有子目录。-name "*.log"
:这是一个筛选条件,-name
选项用于根据文件名进行匹配。*.log
是一个通配符表达式,其中*
表示任意数量的任意字符,所以该条件会匹配所有文件名以.log
结尾的文件。-print0
:find
命令的一个选项,它会将查找到的每个符合条件的文件的完整路径输出,并且每个路径之间用空字符(\0
)分隔,而不是默认的换行符。使用空字符作为分隔符可以避免文件名中包含空格、换行符等特殊字符时可能导致的问题。
2. |
(管道符号)
管道符号用于将一个命令的输出作为另一个命令的输入。在这里,find
命令的输出(即所有符合条件的 .log
文件的路径)会被传递给 xargs
命令。
3. xargs
命令部分
xargs
:这个命令用于将标准输入的内容转换为命令行参数。它会读取输入的内容,并将其拆分成多个参数,然后传递给指定的命令执行。-0
:xargs
命令的一个选项,它告诉xargs
使用空字符(\0
)作为输入内容的分隔符,这与find
命令的-print0
选项相匹配,确保在处理包含特殊字符的文件名时不会出错。rm
:xargs
要执行的命令,即删除文件的命令。xargs
会将从find
命令接收到的文件路径作为参数传递给rm
命令,从而实现对这些文件的删除操作。
注意事项
- 此命令会直接删除文件,且没有确认提示,使用时需谨慎,确保操作的文件是你确实想要删除的。
- 如果
/log
目录不存在或者没有足够的权限访问该目录及其文件,命令可能会报错。
3. 安全确认模式
-ok
是 find 命令的一个选项,与 -exec 类似,都是用于指定对查找到的符合条件的文件执行特定命令。但 -ok 比 -exec 更加谨慎,它在执行命令之前会向用户进行确认。只有当用户输入 y 或 Y 表示同意后,才会真正执行命令;若输入其他内容,则会跳过该文件,继续处理下一个符合条件的文件。
find /var -name "*.old" -ok rm {} \; # 每项操作前确认
五、性能优化方案
-
搜索路径优化
# 优先指定最小范围 find /home/user/project -name "*test*"
-
排除特定目录
find / -path "/mnt" -prune -o -name "*.conf"
-prune
是 find 命令的一个选项,其作用是告诉 find 命令跳过当前匹配到的目录,不继续递归搜索该目录及其子目录。在这个命令中,当 find 遇到 /mnt 目录时,使用 -prune 选项会跳过 /mnt 目录及其所有子目录,避免在这些目录中进行后续的搜索操作。
- 并行处理加速
find . -type f -print0 | xargs -0 -P 4 md5sum
-P 4
:xargs 命令的选项,-P 用于指定并行执行命令的最大进程数。这里的 4 表示 xargs 最多会同时启动 4 个进程来执行后续的命令,以此提高处理效率。md5sum
:是一个用于计算文件 MD5 哈希值的命令。xargs 会将从 find 命令接收到的文件路径作为参数传递给 md5sum 命令,从而对这些文件计算 MD5 哈希值。
六、经典应用场景
1. 系统清理
# 删除7天前的临时文件
find /tmp -type f -mtime +7 -delete# 查找空目录并删除
find . -type d -empty -exec rmdir {} \;
2. 安全审计
查找SUID权限文件
find / -perm /4000 -user root -type f
-perm /4000
-perm
选项:用于根据文件的权限来筛选文件。/
符号:在权限匹配中,/ 表示 “或” 的关系,即只要文件的权限中包含指定的任何一位权限,该文件就会被匹配。4000
:在 Unix/Linux 系统中,文件权限使用数字表示,4000 对应的是 suid(Set User ID)位。当一个文件设置了 suid 位,普通用户在执行该文件时,会以文件所有者的身份运行。所以 -perm /4000 表示查找那些具有 suid 位权限的文件。
-user root
-user
选项:用于根据文件的所有者来筛选文件。root
:表示文件的所有者必须是 root 用户。因此,该条件会筛选出所有者为 root 的文件。
检测世界可写文件
find / -xdev -type f -perm -o=w ! -user root
-xdev
选项表示 “不跨越设备”(don’t cross devices)。当使用该选项时,find 命令只会在当前文件系统中进行搜索,不会跨越到其他挂载的文件系统。例如,如果 /home 挂载在另一个磁盘分区上,使用 -xdev 后,find 不会搜索 /home 目录所在的文件系统,仅在根目录所在的文件系统中查找文件。-perm -o=w
-perm
选项用于根据文件的权限来筛选文件。-
表示文件的权限必须完全包含指定的权限位。o
表示其他用户(other users),即除了文件所有者和所属组用户之外的用户。=w
表示具有写权限。所以 -perm -o=w 表示查找那些其他用户对其具有写权限的文件。
! -user root
!
是逻辑非操作符,表示取反。-user
选项用于根据文件的所有者来筛选文件。root
表示 root 用户。所以 ! -user root 表示查找文件所有者不是 root 用户的文件。
3. 批量处理
# 修改文件权限
find /shared -type f -exec chmod 644 {} \;# 转换图片格式
find . -name "*.png" -exec mogrify -format jpg {} \;
mogrify -format jpg
mogrify
是 ImageMagick 软件包中的一个工具,用于对图像文件进行批量修改,如调整大小、改变格式、添加水印等。-format jpg
是 mogrify 的一个选项,用于指定将图像文件转换为 JPEG 格式。
七、异常处理指南
- 权限问题
在 Linux 系统中,每个进程都有三个标准数据流:标准输入(stdin,文件描述符为 0)、标准输出(stdout,文件描述符为 1)和标准错误输出(stderr,文件描述符为 2)。sudo find / -name "kernel.log" 2>/dev/null
- 2>/dev/null
2> 是重定向符号,用于将标准错误输出(文件描述符为 2)重定向到指定的位置。
/dev/null 是一个特殊的设备文件,也被称为 “黑洞”,所有写入它的数据都会被丢弃。所以 2>/dev/null 的作用是将 find 命令执行过程中产生的所有错误信息重定向到 /dev/null,从而在终端上不会显示这些错误信息,使输出更加简洁。
-
特殊字符处理
find . -name "* strange*" -exec echo {} \;
-
性能监控
time find / -type f -name "*.conf" >/dev/null 2>&1 #合并2stderr和1stdout
- time
time
是一个用于测量命令执行时间的工具。它可以统计命令从开始执行到结束所花费的时间,通常会输出三个时间指标: - 用户时间(user time):命令在用户态执行所花费的 CPU 时间。
- 系统时间(system time):命令在内核态执行所花费的 CPU 时间。
- 实际时间(real time):从命令开始执行到结束所经过的实际时间,这个时间包含了 CPU 等待 I/O 操作等非 CPU 计算的时间。
八、组合命令示例
查找大文件并排序
find / -type f -size +100M -exec du -h {} \; | sort -rh
du
是一个用于估算文件或目录磁盘使用空间的命令。-h
是 du 命令的选项,用于以人类可读的格式显示文件大小,例如使用 KB、MB、GB 等单位。sort -rh
sort
是一个用于对文本行进行排序的命令。-r
是 sort 命令的选项,表示反向排序,即从大到小排序。-h
是 sort 命令的选项,用于按照人类可读的文件大小格式进行排序。所以 sort -rh 会将 du -h 输出的结果按照文件大小从大到小进行排序。
实时监控文件变化
watch -n 5 'find /uploads -newermt "5 minutes ago"'
-
watch
watch 是一个 Linux 命令,它可以周期性地执行指定的命令,并将命令的输出结果显示在终端上。每次执行命令后,watch 会清空终端屏幕,然后显示新的命令输出,方便用户实时观察命令执行结果的变化。 -
-n 5
-n
是 watch 命令的一个选项,用于指定命令执行的时间间隔,单位为秒。这里的 5 表示每隔5
秒执行一次后面指定的命令。 -
-newermt
:find 命令的一个选项,用于根据文件的修改时间来筛选文件和目录。-newermt 后面需要跟一个时间参数,它会找出修改时间晚于指定时间的文件和目录。
# 创建文件清单
find src/ -name "*.java" -fprintf filelist.txt "%p\n"
-fprintf
是 find 命令的一个选项,用于将查找到的符合条件的文件信息按照指定的格式写入到指定的文件中。"%p\n"
这是 -fprintf 选项的格式字符串,用于指定写入文件的内容格式:%p
是一个占位符,表示文件的完整路径。\n
是换行符,用于在每个文件路径后面添加一个换行,使每个文件路径单独占一行。
💡 建议:将常用find组合保存为别名
alias findlarge='find . -type f -size +100M -exec ls -lh {} \; | awk "{ print \$NF \": \" \$5 }"'
此命令行定义了一个名为 findlarge 的别名(alias)。该别名的作用是在当前目录(.)及其子目录中查找大小超过 100MB 的普通文件,然后将这些文件的文件名和文件大小以易读的格式输出。
alias
是一个用于创建命令别名的 shell 命令。通过创建别名,你可以为一个复杂的命令序列定义一个简短、易记的名称,之后在命令行中输入这个别名就相当于执行了完整的命令序列。
我有快乐的勇气,也有悲伤的勇气。 —阿尔弗雷德·阿德勒
相关文章:

Linux搜索---find
find搜索 find 命令的核心功能是在指定的目录路径下,递归地搜索文件和目录,并且可以根据多种条件对搜索结果进行筛选,还能对符合条件的文件和目录执行特定操作。 一、基础语法结构 find [起始目录] [匹配条件] [执行操作] # 基本示例 find…...

python之爬虫入门实例
链家二手房数据抓取与Excel存储 目录 开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备 1.1 必要组件安装 # 安装核心库 pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明: - requests&#x…...

Blender常用快捷键的汇总
一、基础操作 全选/取消全选:A(全选)、AA(连续按两次A取消全选)复制物体:Shift D(复制后需点击确认位置)移动物体:G(按X/Y/Z可约束轴向移动)旋转…...

鸿蒙启动页开发
鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件,找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…...

Unity 文字高度自适应
期望 文字有字号限制,输入文字文字后先判断高度是否适用于限制字号,若处于最小字号时高度任不适用,则调整RectTransform 的高度。 核心代码 每次输入文字时先将字号设定为原始字号。 comp.fontSize fontSize; comp.text content; 拓展T…...

Teaching Small Language Models Reasoning throughCounterfactual Distillation
2024.emnlp-main.333.pdfhttps://aclanthology.org/2024.emnlp-main.333.pdf 1.概述 大型语言模型(LLM),如GPT-3,在各种下游任务中表现出色,包括通过链式思维(CoT)进行问题解答。CoT鼓励模型在解决问题时生成中间推理步骤。尽管LLM取得了成功,但由于模型大小的限制,其…...

快速开始React开发(一)
快速开始React开发(一) React是一个JavaScript库,用于构建交互式网站,并且能够快捷创建SPA(Single Page App),其组件化的思想也是被一再传播,无论是普通的Web网站还是嵌入移动端交互…...

2025最新Transformer模型及深度学习前沿技术应用
第一章、注意力(Attention)机制 1、注意力机制的背景和动机(为什么需要注意力机制?注意力机制的起源和发展里程碑)。 2、注意力机制的基本原理(什么是注意力机制?注意力机制的数学表达与基本公…...

极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...

[环境搭建篇] Windows 环境下如何安装Docker工具
Windows 环境下如何安装Docker工具 1. 检查系统要求2. 启用WSL 2和虚拟化步骤一:启用WSL步骤二:启用虚拟化(Hyper-V)步骤三:安装WSL 2内核 3. 安装Docker Desktop4. 配置Docker5. 家庭版用户替代方案6. 常见问题解决问…...

JavaScript 数组和字符串方法详解
一、数组方法 数组方法是操作数组的核心工具,分为修改原数组和返回新数组两类。 1. 常用修改原数组的方法 方法参数返回值说明示例push...items新长度末尾添加元素arr.push(4) → [1,2,3,4]pop无删除的元素删除最后一个元素arr.pop() → 3(原数组变[1,…...

达梦数据库系列之Mysql项目迁移为达梦项目
达梦数据库系列之Mysql项目迁移为达梦项目 1 达梦数据库安装及MySql数据迁移2 SpringBoot项目迁移2.1 驱动包引入2.2 驱动类配置2.3 数据源配置2.4 flowable迁移2.4.1 异常问题2.4.2 解决 3 迁移常见问题3.1 不是 GROUP BY 表达式3.1.1 dm.ini 开启Mysql兼容模式3.1.2 修改动态…...

10个实用IntelliJ IDEA插件
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 以下是为提升开发效率推荐的10个实用IntelliJ IDEA插件,涵盖代码质量、效率工具及热门框架支持: 一、代码质量与规范 SonarLint 实时…...

10分钟从零开始搭建机器人管理系统(飞算AI)
1. 安装插件 https://www.feisuanyz.com/ 2. Intellij IDEA中运行 创建一个BS架构的机器人远程操控系统,具备机器人状态及位置实时更新,可以实现机器人远程遥控,可以对机器人工作日志进行统计分析,以及其它管理系统的常用功能3…...

[自动驾驶-传感器融合] 多激光雷达的外参标定
文章目录 引言外参标定原理ICP匹配示例参考文献 引言 多激光雷达系统通常用于自动驾驶或机器人,每个雷达的位置和姿态不同,需要将它们的数据统一到同一个坐标系下。多激光雷达外参标定的核心目标是通过计算不同雷达坐标系之间的刚性变换关系(…...

怎么让呼叫中心支持高并发
基于FreeSWITCH的呼叫中心系统并发性能优化指南 在呼叫中心系统建设中,高并发处理能力是衡量系统稳定性和效率的核心指标。作为开源软交换平台的代表,FreeSWITCH凭借其线程模型和模块化架构,天然适合高并发场景。然而,实际应用中仍…...

Elasticsearch简单学习
1、依赖的导入 <!--ES依赖--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2、客户端链接 RestHighLevelClient client new RestHigh…...

就像BGP中的AS_PATH一样,无论路途多远,我愿意陪你一起走——基于华为ENSP的BGP的路由负载均衡及过滤深入浅出
本篇技术博文摘要 🌟 本文内容涵盖了BGP负载均衡的基本概念、配置技巧和在实际网络中的应用,包括如何在华为ENSP上实现负载均衡和路由过滤。通过配置BGP的前缀列表、ACL以及路由过滤策略,可以实现网络流量的精确控制和优化,提高网…...

valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug
valgrind --toolhelgrind ./your_program 如果检测的对象是大型程序,可以设定仅在某些函数中开启 valgrind 的检测: Valgrind 提供了一些客户请求(client requests),可以在代码中插入特定的宏来控制 Valgrind 的行为。…...

游戏引擎学习第135天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中,不使用任何现成的游戏引擎或第三方库,而是直接基于 Windows 进行开发,因为 Windows 目前仍然是游戏的标准平台,因此首先在这个环境中进行…...

异步操作返回原始上下文
是什么? 在讨论同步上下文执行回调的概念时,我们首先需要了解一些基本概念:同步与异步操作、上下文以及回调函数。 同步与异步操作: 同步操作是指代码按照顺序依次执行,每个操作必须等待前一个操作完成才能开始。这便…...

区块链中的数字签名:安全性与可信度的核心
数字签名是区块链技术的信任基石,它像区块链世界的身份证和防伪标签,确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言,带你彻底搞懂区块链中的数字签名! 文章目录 1. 数字签名是什么?从现实世界到区块…...

vulnhub渗透日记23:bulldog
声明 文中涉及操作均来自靶机虚拟环境,禁止用于真实环境,任何未经授权的渗透测试都是违法行为! 开搞 首先nmap扫描目标机开放端口和服务 访问80端口 扫目录撒 发现登录口 点击web-shell提示登录后才能使用 /dev/下面查看网页源码发现村咋h…...

macOS - 使用 tmux
文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面,然后 输入 Control Option B 进入交互模式 输入 % 左右分栏," 上下分割 上一个窗格:{,下一个:} PS…...

Armbian: 轻量级 ARM 设备专用 Linux 发行版全面解析
引言 在嵌入式开发和物联网(IoT)领域,选择合适的操作系统至关重要。对于 Raspberry Pi、Orange Pi、Banana Pi 以及 Rockchip、Amlogic、Allwinner 等 ARM 平台上的单板计算机(SBC),一个高效、轻量级并且易…...

微服务通信:用gRPC + Protobuf 构建高效API
引言 在微服务架构中,服务之间的通信是系统设计的核心问题之一。传统的RESTful API虽然简单易用,但在性能、类型安全和代码生成等方面存在一定的局限性。gRPC作为一种高性能、跨语言的RPC框架,结合Protobuf(Protocol Buffers&…...

Spring Boot 整合 JMS-ActiveMQ,并安装 ActiveMQ
1. 安装 ActiveMQ 1.1 下载 ActiveMQ 访问 ActiveMQ 官方下载页面,根据你的操作系统选择合适的版本进行下载。这里以 Linux 系统,Java环境1.8版本为例,下载 apache-activemq-5.16.7-bin.tar.gz。 1.2 解压文件 将下载的压缩包解压到指定目…...

容器 /dev/shm 泄漏学习
容器 /dev/shm 泄漏的介绍 在容器环境中,/dev/shm 是一个基于 tmpfs 的共享内存文件系统,通常用于进程间通信(IPC)和临时数据存储。由于其内存特性,/dev/shm 的大小是有限的,默认情况下 Docker 容器的 /de…...

Spring Boot 3.x 基于 Redis 实现邮箱验证码认证
文章目录 依赖配置开启 QQ 邮箱 SMTP 服务配置文件代码实现验证码服务邮件服务接口实现执行流程 依赖配置 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…...

车载测试:智能座舱测试中多屏联动与语音交互的挑战
智能座舱作为汽车智能化发展的核心,集成了多屏联动和语音交互功能,为驾驶员和乘客提供更便捷的体验。然而,这些功能的测试面临诸多挑战,包括多屏同步性、噪声干扰和复杂场景的处理。本文将详细分析这些挑战,探讨测试方…...