
find命令用于在指定目录及其子目录中递归地搜索文件和目录,并根据各种条件(如名称、类型、大小、修改时间等)进行过滤。它的功能远不止简单的查找,还能对找到的文件执行操作。
命令功能
搜索文件:基于文件名、路径、大小、时间、权限等数十种条件进行搜索。
执行操作:对搜索到的文件执行其他命令(如删除、复制、查看详情等)。
命令语法
基本语法格式如下:
[路径...]:指定开始搜索的目录。可以指定多个目录,默认为当前目录 .。
[表达式]:定义搜索条件的选项,如 -name, -type, -size等。
[操作]:定义对找到的文件执行什么操作,如 -print(默认), -delete, -exec。
核心概念:表达式(Tests)和操作(Actions)
find命令的强大之处在于其丰富的表达式和操作。
常用表达式(搜索条件)
表达式 | 说明 | 示例 |
|---|
-name <模式>
| 按文件名搜索(区分大小写)。可使用通配符 *, ?, []。 | find . -name "*.txt"
|
-iname <模式>
| 按文件名搜索(不区分大小写)。 | find . -iname "readme.*"
|
-type <类型>
| 按文件类型搜索。
f:普通文件
d:目录
l:符号链接 | find /var -type f
find . -type d
|
-size <大小>
| 按文件大小搜索。
+n:大于 n
-n:小于 n
n:等于 n 单位:c(字节), k(KB), M(MB), G(GB) | find . -size +10M
find . -size -1k
|
-mtime <天数>
| 按修改时间搜索(基于24小时周期)。
+n:n24小时之前修改过
-n:n24小时之内修改过
n:正好n天前修改过 | find /tmp -mtime +7
find . -mtime -1
|
-user <用户名>
| 按文件所有者搜索。 | find /home -user alice
|
-group <组名>
| 按文件所属组搜索。 | find /etc -group shadow
|
-perm <权限>
| 按文件权限搜索。 | find . -perm 644
find /usr -perm /u=s(找SUID文件)
|
-empty
| 查找空文件或空目录。 | find . -empty
|
-maxdepth <n>
| 指定搜索的最大目录深度。1表示只搜索当前目录。 | find . -maxdepth 2 -name "*.conf"
|
-mindepth <n>
| 指定开始搜索的最小目录深度。 | find / -mindepth 3 -name "passwd"
|
常用操作(对找到的文件做什么)
操作 | 说明 | 示例 |
|---|
-print
| 打印匹配文件的完整路径(这是默认操作)。 | find . -name "*.log" -print
|
-ls
| 以 ls -dils格式显示匹配文件的详细信息。 | find . -name "core" -ls
|
-delete
| 删除匹配到的文件。非常危险,需谨慎使用! | find /tmp -name "*.tmp" -delete
|
-exec <command> {} \;
| 对每个找到的文件执行指定的命令。{}是占位符,代表找到的文件路径。\;表示命令结束。 | find . -name "*.jpg" -exec ls -l {} \;
|
-ok <command> {} \;
| 与 -exec类似,但在执行每个命令前会询问确认。更安全。 | find . -name "*.old" -ok rm {} \;
|
常用示例
1. 按名称查找文件
在当前目录及子目录中查找所有 .conf配置文件。
2. 按类型查找
查找 /var目录下的所有子目录。
查找当前目录下的所有普通文件。
3. 按大小查找
查找当前目录下大于 100MB 的文件。
查找 /home目录下小于 1KB 的文件。
4. 按时间查找
查找 /var/log目录下 7 天前修改过的文件。
查找用户主目录下最近 1 天内修改过的文件。
5. 组合条件查找(与/或/非)
与(AND):查找当前目录下所有大于 10MB 的 .log文件(必须同时满足两个条件)。
find . -name "*.log" -size +10M
或(OR):查找当前目录下所有 .jpg或 .png图片文件(满足一个条件即可)。-o表示“或”。
find . -name "*.jpg" -o -name "*.png"
非(NOT):查找当前目录下不是.txt格式的文件。!或 -not表示“非”。
find . ! -name "*.txt"
# 或者
find . -not -name "*.txt"
6. 对找到的文件执行操作 - 删除
安全做法:先预览要删除的文件,确认无误后再执行删除。
# 1. 先查看要删除什么
find /tmp -name "*.tmp" -ls
# 2. 确认无误后,使用 -delete 删除
find /tmp -name "*.tmp" -delete
# 或者更安全的 -ok,它会一个个询问你
find /tmp -name "*.tmp" -ok rm {} \;
7. 对找到的文件执行操作 - 复制/移动
将找到的所有 .c文件复制到 ~/backup/目录。
find . -name "*.c" -execcp {} ~/backup/ \;
8. 对找到的文件执行操作 - 更改权限
将找到的所有 .sh脚本文件添加可执行权限。
find . -name "*.sh" -execchmod +x {} \;
9. 限制搜索深度
只搜索当前目录和下一级子目录(深度为2),查找 settings.ini文件。
find . -maxdepth 2 -name "settings.ini"
10. 查找并处理文件名中的空格
如果文件名包含空格,使用 -print0和 xargs -0可以安全处理。
find . -name "*.mp3" -print0 | xargs -0 -I {} mv {} /target/directory/
高级技巧与注意事项
始终先测试:在使用 -delete或 -exec rm等破坏性操作前,先用 -print或 -ls测试一下命令会匹配到哪些文件。
路径参数:如果不指定路径,默认从当前目录 .开始搜索。要搜索整个系统,可以使用 find / -name ...,但这可能很慢且有权限错误。通常用 2>/dev/null过滤错误信息:find / -name "pattern" 2>/dev/null。
理解 -exec的语法:
{}是一个占位符,会被当前文件的路径替换。
\;是必须的,用于终止 -exec的命令。
有时使用 +代替 \;更高效,它会将多个文件一次性传递给命令(但要求命令能接受多个参数):find . -name "*.txt" -exec cat {} + > all_text.txt
性能:find非常强大但可能较慢,因为它需要遍历目录树。对于在特定位置(如 HOME 目录)按名称快速查找,locate命令更快(但非实时)。
find是系统管理员和开发者的必备工具,花时间掌握它将会极大地提高你的工作效率。