目录
1. 概述
find 命令用于在指定路径下搜索文件和目录,支持多种查找条件(如名称、类型、大小、时间等),并可对查找结果执行操作(如删除、复制等)。其语法为:
find [路径] [选项] [表达式]
- 路径:搜索的起始目录,如
.(当前目录)、/var/log等。若不指定,默认从当前目录开始。 - 选项:控制
find行为,如-maxdepth(限制搜索深度)。 - 表达式:定义查找条件(如
-name、-type)或操作(如-delete、-exec)。
以下是常用命令总结:
- 按名称查找:
find . -name "file1" -type f - 不区分大小写:
find . -iname "file*" -type f - 按时间查找:
find /var/log -name "*.log" -type f -mtime -7 - 删除文件:
find /tmp -name "core.*" -type f -delete - 查找空文件/目录:
find . -type f -empty或find . -type d -empty - 按大小查找:
find . -type f -size +10M - 执行命令:
find . -name "*.tmp" -type f -print0 | xargs -0 rm -f
2. 前提条件
- 权限:确保对搜索路径有读取权限,部分操作(如删除)需要写权限。
- 工具:
find命令通常预装在 Linux 系统中,属于findutils包。若缺失,可安装:sudo apt update && sudo apt install findutils # Debian/Ubuntu sudo yum install findutils # CentOS/RHEL - 注意:部分操作(如删除文件)具有破坏性,建议先用
-print预览结果。
3. 常用选项和表达式
以下是 find 命令的常用选项和表达式,用于构建查找条件:
-
基本选项:
-maxdepth N:限制搜索的最大目录深度(N 为正整数)。-mindepth N:仅查找深度大于等于 N 的文件/目录。-type TYPE:指定文件类型,如f(普通文件)、d(目录)、l(符号链接)。-name PATTERN:按文件名匹配(区分大小写,需用引号括住模式)。-iname PATTERN:按文件名匹配(不区分大小写)。-size SIZE:按文件大小匹配,如+10M(大于 10MB)、-1G(小于 1GB)。-mtime DAYS:按文件修改时间匹配(天数,如-7表示 7 天内修改)。-empty:查找空文件或空目录。-perm MODE:按文件权限匹配,如-perm 644。
-
操作表达式:
-print:打印匹配结果(默认操作)。-delete:删除匹配的文件/目录(谨慎使用)。-exec COMMAND {} \;:对每个匹配项执行指定命令。-print0:以\0分隔输出,适合处理包含空格或特殊字符的文件名。
-
逻辑运算:
-a或AND:逻辑与(默认),多个条件均需满足。-o或OR:逻辑或,满足任一条件。!或-not:逻辑非,排除某些条件。
4. 常用示例
以下是 find 命令的常见用法,涵盖基本查找、组合条件、执行操作等场景。所有示例以当前目录(.)或特定路径为起点。
4.1 按文件名查找
查找当前目录下名为 file1 的普通文件:
find . -name "file1" -type f
- 说明:
-name "file1"精确匹配文件名,-type f限制为普通文件。
4.2 不区分大小写查找
查找当前目录下文件名以 file 开头的文件(不区分大小写):
find . -iname "file*" -type f
- 说明:
-iname忽略大小写,*为通配符,匹配file1、File2等。
4.3 按修改时间查找
查找 /var/log 下 7 天内修改过的 .log 文件:
find /var/log -name "*.log" -type f -mtime -7
- 说明:
-name "*.log":匹配以.log结尾的文件。-mtime -7:文件在 7 天内被修改(-表示小于)。- 类似选项:
-mtime +7:7 天前修改的文件。-atime:按访问时间。-ctime:按状态变更时间。
4.4 查找并删除文件
删除 /tmp 下以 core. 开头的文件(谨慎操作):
find /tmp -name "core.*" -type f -delete
- 说明:
-delete直接删除匹配文件,无需确认,建议先用-print预览:find /tmp -name "core.*" -type f -print
- 注意:删除操作不可恢复,务必确认路径和条件。
4.5 查找空文件或空目录
查找当前目录下的空文件:
find . -type f -empty
查找当前目录下的空目录:
find . -type d -empty
- 说明:
-empty匹配内容为空的文件或不含子目录的目录。
4.6 按文件大小查找
查找当前目录下大于 10MB 的文件:
find . -type f -size +10M
- 说明:
-size +10M:大于 10MB(+表示大于,-表示小于)。- 单位支持:
k(KB)、M(MB)、G(GB)、c(字节)。 - 示例:查找小于 1GB 的文件:
find . -type f -size -1G
4.7 查找后执行命令
查找当前目录下以 .tmp 结尾的文件并删除(通过 xargs 处理):
find . -name "*.tmp" -type f -print0 | xargs -0 rm -f
- 说明:
-print0:以\0分隔输出,适合处理含空格或特殊字符的文件名。xargs -0:以\0读取输入,调用rm -f删除。
- 替代方法(使用
-exec):find . -name "*.tmp" -type f -exec rm -f {} \;-exec直接执行命令,{}表示匹配的文件,\;结束命令。
4.8 按权限查找
查找当前目录下权限为 644 的文件:
find . -type f -perm 0644
- 说明:
-perm 0644:精确匹配权限为rw-r--r--的文件。- 示例:查找可执行文件(至少有
x权限):find . -type f -perm /u=x,g=x,o=x
4.9 组合条件查找
查找 /home 下大于 100MB 且 30 天内未修改的文件:
find /home -type f -size +100M -mtime +30
- 说明:多个条件默认使用逻辑与(
-a),需同时满足。
查找文件名包含 test 或 backup 的文件:
find . -type f \( -name "*test*" -o -name "*backup*" \)
- 说明:
-o表示逻辑或,括号\( \)用于分组条件。
4.10 限制搜索深度
查找当前目录下最多两级子目录中的 .txt 文件:
find . -maxdepth 2 -name "*.txt" -type f
- 说明:
-maxdepth 2:限制搜索深度为 2 级(当前目录及其子目录)。-mindepth 2:可用于仅查找深度大于等于 2 的文件。
4.11 查找并复制文件
查找 /data 下以 .jpg 结尾的文件并复制到 /backup:
find /data -name "*.jpg" -type f -exec cp {} /backup \;
- 说明:
-exec cp {} /backup \;将匹配文件复制到目标目录。
4.12 查找并统计行数
查找当前目录下 .c 文件并统计总行数:
find . -name "*.c" -type f -exec cat {} \; | wc -l
- 说明:
-exec cat {} \;输出文件内容,wc -l统计行数。
5. 验证和调试
- 预览结果:在执行破坏性操作(如
-delete)前,始终使用-print查看匹配结果:find /tmp -name "temp*" -type f -print - 处理特殊字符:对于文件名含空格或特殊字符的情况,使用
-print0和xargs -0:find . -name "*.log" -type f -print0 | xargs -0 ls -l - 查看执行状态:检查
find命令的退出状态:echo $?- 0:成功执行。
- 非 0:可能权限不足或路径不存在。
6. 注意事项
- 权限问题:若搜索路径无权限,
find会报Permission denied。可用2>/dev/null屏蔽错误:find / -name "file1" -type f 2>/dev/null - 性能优化:
- 使用
-maxdepth限制搜索深度,减少扫描范围。 - 优先指定具体路径(如
/var/log而非/)以提高效率。
- 使用
- 谨慎使用
-delete:删除操作不可恢复,建议先用-print确认。 - 大小单位:注意
-size的单位(如M表示 MB,c表示字节)。 - 通配符:
-name和-iname的模式需用引号括住(如"*.log"),以避免 shell 扩展。
7. 高级用法
- 查找并修改权限:
查找并将.sh文件设置为可执行:find . -name "*.sh" -type f -exec chmod +x {} \; - 查找最近访问的文件:
查找 1 小时内访问过的文件:find . -type f -atime -1 - 查找符号链接:
查找当前目录下的符号链接:find . -type l - 结合
grep查找文件内容:
查找包含特定字符串的文件:find . -name "*.txt" -type f -exec grep "keyword" {} \;
浙公网安备 33010602011771号