find 命令支持通过各种条件(如文件名、时间、大小等)递归搜索目录,还可以对查找到的文件执行操作(如删除、移动、修改权限等)。
1. find 命令的基本语法
find [路径...] [表达式]
- 路径:指定要搜索的目录路径。如果不指定路径,默认为当前目录(
.)。 - 表达式:定义搜索条件、逻辑运算和动作。可以组合多种选项来实现复杂的搜索需求。
默认情况下,find 会递归搜索目录中的所有文件和子目录。如果没有指定任何表达式,find 默认使用 -print,打印所有文件和目录的路径。
2. 常用选项和用途
以下是 find 命令常见选项及其对应的用途:
| 选项 | 用途 |
|---|---|
-name PATTERN | 根据文件名匹配(区分大小写)。 |
-iname PATTERN | 根据文件名匹配(忽略大小写)。 |
-type [f/d/l/etc.] | 根据文件类型搜索:文件(f)、目录(d)、符号链接(l) 等。 |
-path PATTERN | 根据路径模式匹配文件或目录。 |
-ipath PATTERN | 根据路径模式匹配(忽略大小写)。 |
-mtime [+/-N] | 按最后修改时间搜索:+N表示 N 天之前,-N表示 N 天之内,N表示恰好 N 天前。 |
-atime [+/-N] | 按最后访问时间搜索,规则同 -mtime。 |
-ctime [+/-N] | 按最后状态更改时间搜索,规则同 -mtime。 |
-mmin [+/-N] | 按最后修改时间(以分钟为单位)搜索。 |
-amin [+/-N] | 按最后访问时间(以分钟为单位)搜索。 |
-cmin [+/-N] | 按最后状态更改时间(以分钟为单位)搜索。 |
-size [+/-N][b/c/k/M] | 根据文件大小搜索:b表示 512 字节块,c表示字节,k表示 KB,M表示 MB。 |
-perm MODE | 按文件权限匹配,例如 -perm 644或 -perm -u+w(用户可写)。 |
-user USER | 按文件所属用户匹配。 |
-group GROUP | 按文件所属用户组匹配。 |
-nouser | 匹配无所属用户的文件。 |
-nogroup | 匹配无所属用户组的文件。 |
-empty | 查找空文件或空目录。 |
-regex PATTERN | 按正则表达式匹配文件路径。 |
-iregex PATTERN | 按正则表达式匹配(忽略大小写)。 |
-newer FILE | 查找比指定文件更新的文件。 |
-maxdepth LEVEL | 限制搜索深度为指定的层级(从当前目录开始)。 |
-mindepth LEVEL | 限制搜索深度为至少指定的层级。 |
-prune | 排除指定的目录及其内容。 |
-follow | 跟随符号链接。 |
-depth | 在处理目录本身之前,先处理其内容。 |
-delete | 删除匹配的文件或目录。 |
-print | 打印匹配的文件或目录路径(默认动作)。 |
-print0 | 打印匹配的文件,用 NULL分隔(用于处理文件名中包含特殊字符的情况)。 |
-exec COMMAND {} \; | 对每个匹配的文件执行指定命令,{}代表当前匹配的文件,\; 表示命令结束。 |
-exec COMMAND {} + | 对匹配的文件批量执行命令(将多个文件作为参数传递给命令)。 |
-ok COMMAND {} \; | 类似于 -exec,但在执行命令前会提示用户确认。 |
-ls | 显示匹配文件的详细信息(类似于 ls -l)。 |
3. 符号链接处理选项
find 提供了选项来控制符号链接的处理方式(如果是一个普通目录,则没有任何特殊作用):
| 选项 | 用途 |
|---|---|
-H | 仅解析命令行指定路径中的符号链接,不解析递归目录中的符号链接。 |
-L | 解析所有符号链接,将其视为目标文件或目录。 |
-P | 不解析符号链接(默认行为)。 |
- 遵循符号链接并查找
.txt文件:
find -L /path -name "*.txt"
- 仅解析命令行路径中的符号链接:
find -H /symlinked-path -type f
4. 逻辑运算符
find 支持逻辑运算符,用于组合或排除多个条件:
| 运算符 | 描述 | 优先级 |
|---|---|---|
() | 分组 | 最高 |
!或 -not | 逻辑非 | 中等 |
-and 或 -a | 逻辑与 | 较低 |
-or 或 -o | 逻辑或 | 最低 |
- 查找
.txt和.log文件:
find /path -name "*.txt" -or -name "*.log"
- 查找不包含
.tmp的文件:
find /path -type f ! -name "*.tmp"
- 组合条件查找:
find /path \( -name "*.txt" -and -size +1M \)
5.调试选项(-D)
find 提供调试选项,用于输出运行过程中的额外信息,帮助用户了解命令的具体行为:
| 选项 | 用途 |
|---|---|
-D help | 显示所有调试选项的帮助信息。 |
-D tree | 显示目录树遍历的调试信息。 |
-D search | 显示文件搜索过程的调试信息。 |
-D stat | 显示文件元数据(如stat 系统调用)的调试信息。 |
-D rates | 显示性能统计信息。 |
-D opt | 显示优化器的调试信息。 |
-D exec | 显示 exec 动作的调试信息。 |
- 排查文件搜索问题:
- 使用
-D search和-D stat检查文件是否正确匹配表达式条件,或是否存在权限问题。
find -D search -D stat /path -name "*.txt"
- 分析目录遍历性能:
- 使用
-D tree检查遍历顺序,结合-D rates查看文件访问数量和执行时间。
find -D tree -D rates /path -name "*.txt"
6. 实际使用场景
- 查找并删除空文件:
find /path -type f -empty -delete
- 查找大于 100MB 的文件:
find /path -size +100M
- 查找
**.log**文件并将其压缩:
find /path -name "*.log" -exec gzip {} \;
- 查找最近 7 天内修改的文件:
find /path -mtime -7
- 排除特定目录并查找文件:
find /path -path "/path/exclude" -prune -o -name "*.txt" -print
- 统计java代码行数:
find /patn -name "*.java" | xargs wc -l
1839

被折叠的 条评论
为什么被折叠?



