find 命令的基本语法
find 命令的基本结构如下:

find [搜索路径] [匹配条件] [操作]
- 搜索路径: 指定要开始搜索的目录,如果省略,则默认从当前目录 () 开始搜索。
- 匹配条件: 指定查找文件需要满足的条件,如文件名、大小、类型、修改时间等。
- 操作: 对找到的文件执行什么操作,如打印、删除、修改权限等,默认操作是
-print(即打印文件路径到标准输出)。
常用匹配条件
这是 find 命令的核心,也是最常用的部分。
按文件名搜索
-name: 按文件名搜索(区分大小写)。-iname: 按文件名搜索(不区分大小写)。-path: 按路径名搜索(区分大小写)。-ipath: 按路径名搜索(不区分大小写)。
示例:
# 在 /etc 目录下查找所有名为 "hosts" 的文件 find /etc -name "hosts" # 在当前目录及其子目录下查找所有以 ".log" 结尾的文件(不区分大小写) find . -iname "*.log" # 在 /var 目录下查找路径中包含 "www" 的目录 find /var -path "*www*"
通配符:
- 匹配任意数量的字符
- 匹配单个字符
[]匹配指定范围内的字符,[a-z]匹配任意小写字母。
按文件类型搜索
-type: 根据文件类型进行筛选。f: 普通文件d: 目录l: 符号链接c: 字符设备文件b: 块设备文件s: 套接字文件p: 命名管道
示例:

# 查找 /home 目录下所有的目录 find /home -type d # 查找当前目录下所有的符号链接 find . -type l
按文件所有者和所属组搜索
-user: 按文件所有者(用户名)搜索。-group: 按文件所属组(组名)搜索。-uid: 按用户 ID 搜索。-gid: 按组 ID 搜索。
示例:
# 查找 /home 目录下所有属于 "nginx" 用户的文件 find /home -user nginx # 查找 /var 目录下所有属于 "www" 组的文件 find /var -group www
按文件大小搜索
-size: 按文件大小搜索,可以使用以下单位:c: 字节k: KB (1024 bytes)M: MB (1024 KB)G: GB (1024 MB)T: TB (1024 GB)
可以使用 或 来表示“大于”或“小于”。
示例:
# 查找当前目录下大小恰好为 100MB 的文件 find . -size 100M # 查找 /var/log 目录下所有大于 100MB 的日志文件 find /var/log -size +100M # 查找当前目录下所有小于 1KB 的文件 find . -size -1k
按时间搜索
-mtime: 按文件内容最后修改时间(天)。-atime: 按文件最后访问时间(天)。-ctime: 按文件状态(如权限、所有者)最后改变时间(天)。
同样,可以使用 或 来表示“多于”或“少于”天。
示例:
# 查找 7 天内被修改过的文件 find . -mtime -7 # 查找超过 30 天未被访问的文件 find . -atime +30 # 查找在 1 到 2 天前状态发生改变的文件 # 注意:find 不支持直接的数值范围,需要组合使用 -a (and) find . -mtime -2 -a -mtime +1
按权限和 inode 搜索
-perm: 按文件权限搜索。-mode: 精确匹配权限(-perm 755)。/mode: 任意一位匹配即可(/222表示任意用户有写权限)。-mode: 所有位都必须匹配(-mode 222表示所有用户都有写权限)。
-inum: 按 inode 号搜索。
示例:
# 查找权限恰好为 644 的文件 find . -perm 644 # 查找所有用户(所有者、组、其他)都有执行权限的文件 find . -perm /111 # 查找其他用户有写权限的文件 find . -perm /002 # 查找 inode 号为 12345 的文件 find . -inum 12345
组合条件
可以使用逻辑运算符将多个条件组合起来。
-a(and): 逻辑与,表示必须同时满足两个条件,默认操作符,可以省略。-o(or): 逻辑或,满足其中一个条件即可。- 或
-not: 逻辑非,表示不满足该条件。
示例:
# 查找 /etc 目录下,修改时间在 7 天内,并且以 ".conf" 结尾的文件 find /etc -mtime -7 -a -name "*.conf" # 查找 /var 目录下,大小大于 50MB,并且属于 "root" 用户的文件 find /var -size +50M -a -user root # 查找 /tmp 目录下,不属于 "root" 用户的文件 find /tmp ! -user root # 查找 /home 目录下,所有者是 "testuser" 或者所属组是 "developers" 的文件 find /home \( -user testuser -o -group developers \)
注意: 当使用
-o或 时,如果条件复杂,最好用\(和\)将它们括起来,以确保优先级正确。
常用操作
默认操作:-print
这是默认操作,将文件路径打印到屏幕上。
# 以下两条命令效果相同 find . -name "*.txt" find . -name "*.txt" -print
-exec: 执行命令
这是 find 最强大的功能之一,可以对找到的每个文件执行指定的命令。
语法:-command {} \;
- 是一个占位符,会被替换为当前找到的文件的完整路径。
\;是用来结束-exec命令的固定符号,前面需要反斜杠。
示例:
# 查找所有 .tmp 文件并删除 (危险操作!)
# -ok 会先询问用户是否执行,更安全
find . -name "*.tmp" -exec rm -f {} \;
# 查找所有 .sh 文件并添加可执行权限
find . -name "*.sh" -exec chmod +x {} \;
# 查找所有 .log 文件,并用 grep 在它们中搜索 "error"
find . -name "*.log" -exec grep "error" {} \;
-ok: 安全的 -exec
-ok 和 -exec 的功能一样,但会在执行每个命令前,向用户发起确认,对于删除等危险操作,强烈推荐使用 -ok。
示例:
# 删除前会询问你是否真的要删除
find . -name "*.tmp" -ok rm -f {} \;
-delete: 删除文件
这是 find 自带的一个删除操作,比 -exec rm {} \; 更简洁、更高效。
示例:
# 删除当前目录下所有名为 .DS_Store 的文件 find . -name ".DS_Store" -delete
警告:
-delete操作非常强大,请确保你的搜索路径和条件是正确的,以免误删重要文件。
-ls: 以 ls -ils 的格式列出文件
以类似 ls 命令的详细格式输出查找结果,包含 inode、权限、所有者、大小、时间等信息。
示例:
# 列出 /etc 目录下所有 conf 文件的详细信息 find /etc -name "*.conf" -ls
综合实例
场景1:查找并清理大文件
# 查找 /var 目录下所有超过 1GB 的大文件,并列出它们的详细信息 find /var -type f -size +1G -ls # 查找 /home 目录下 30 天内未被修改、大小超过 10MB 的文件,并询问是否删除 find /home -type f -mtime +30 -size +10M -ok -delete \;
场景2:查找特定权限的文件
# 查找所有用户(包括其他用户)都有写权限的文件,这可能存在安全风险 find / \( -perm /002 -a ! -type d \) -ls
场景3:查找并打包文件
# 查找 /etc 目录下所有 .conf 文件,并将它们打包成 etc_conf.tar.gz
# 注意:这里使用了 `+` 代替 `\;`,表示将所有找到的文件作为参数一次性传给 tar 命令,效率更高
find /etc -name "*.conf" -exec tar -czf etc_conf.tar.gz {} +
find 命令与 grep 命令的区别
初学者经常会混淆 find 和 grep,它们有本质区别:
| 特性 | find |
grep |
|---|---|---|
| 搜索对象 | 文件(按文件名、属性、大小等) | (按文本字符串) |
| 搜索范围 | 目录树(文件系统) | (文本流) |
| 常用组合 | find ... -exec grep ... |
grep -r ... (递归搜索) |
简单记忆:
find是找文件本身。grep是在文件里找文字。
示例:
# 使用 find + grep 组合:先找到所有 .log 文件,然后在这些文件的内容中搜索 "ERROR"
find /var/log -name "*.log" -exec grep "ERROR" {} \;
# 使用 grep 的 -r 选项可以达到类似效果(更简单)
grep -r "ERROR" /var/log --include="*.log"
find 命令是 CentOS/Linux 系统管理员的瑞士军刀,掌握它需要实践,建议从简单的 -name、-type、-size 开始,然后逐步学习 -exec 和 -delete 等高级功能,使用时,特别是涉及删除操作时,务必小心谨慎,可以先使用 -ls 或 -ok 来预览和确认。
