ind 是 Linux/Unix 系统中最强大、最常用的文件搜索命令。它可以根据多种条件(名称、类型、大小、时间等)在指定目录中递归搜索文件,并执行相应操作。
一、基本语法
find [路径] [匹配条件] [操作]
路径:搜索的起始目录,默认为当前目录 .
匹配条件:各种搜索标准(名称、类型、时间等)
操作:对找到的文件执行的操作,默认为打印到屏幕
二、常用匹配条件
- 按文件名搜索
# 按名称(精确匹配)
find /home -name "file.txt"
# 按名称(不区分大小写)
find /home -iname "file.txt"
# 使用通配符
find /home -name "*.txt"
find /home -name "file?.txt"
- 按文件类型搜索
# f: 普通文件,d: 目录,l: 符号链接
find /var -type f
find /etc -type d
find /usr -type l
# 其他类型:b(块设备), c(字符设备), p(命名管道), s(套接字)
- 按文件大小搜索
# 大于10M的文件
find / -size +10M
# 小于1K的文件
find /var/log -size -1k
# 等于512字节的文件
find . -size 512c
# 单位:c(字节), k(KB), M(MB), G(GB)
- 按时间搜索
# 按修改时间(mtime)
find /etc -mtime -7 # 7天内修改的
find /home -mtime +30 # 30天前修改的
find . -mtime 7 # 正好7天前修改的
# 按访问时间(atime)
find /var/log -atime +90 # 90天前访问的
# 按状态改变时间(ctime)
find /etc -ctime -1 # 24小时内状态改变的
# 按分钟计算(min)
find /tmp -mmin -30 # 30分钟内修改的
- 按权限和所有权
# 按权限精确匹配
find . -perm 644
# 按权限模式匹配(至少包含这些权限)
find /usr/bin -perm -u=s # 查找SUID文件
find . -perm -o=w # 其他用户可写的文件
# 按用户和组
find /home -user john
find /var -group admin
find /etc -uid 1000
三、组合条件搜索
# AND 逻辑(默认)
find /home -name "*.txt" -type f
# OR 逻辑
find /var -name "*.log" -o -name "*.conf"
# NOT 逻辑
find . ! -name "*.tmp"
find /home -user john ! -type d
# 分组条件
find / \( -name "*.tmp" -o -name "*.log" \) -mtime +7
四、执行操作
- 默认操作:打印
find . -name "*.txt" -print # 默认操作,可省略
- 删除文件
# 删除所有 .tmp 文件
find /tmp -name "*.tmp" -delete
# 安全删除(先查看)
find . -name "*.tmp" -type f -exec rm -f {} \;
- 执行命令(-exec)
# 基本格式
find . -name "*.txt" -exec command {} \;
# 示例:改变文件权限
find . -name "*.sh" -exec chmod 755 {} \;
# 示例:查找文件内容
find . -name "*.conf" -exec grep "error" {} \;
# 使用 + 代替 \; 提高效率(多个文件一起处理)
find . -name "*.jpg" -exec cp {} /backup/ +
- 其他操作
# -ls:显示详细信息
find /etc -name "*.conf" -ls
# -printf:格式化输出
find . -type f -printf "%p - %s bytes\n"
# -ok:交互式确认后执行
find . -name "*.old" -ok rm {} \;
五、实用示例
- 清理临时文件
# 删除7天前的 .log 文件
find /var/log -name "*.log" -mtime +7 -delete
# 删除空目录
find /tmp -type d -empty -delete
- 查找大文件
# 查找大于100M的文件
find / -type f -size +100M 2>/dev/null
# 查找并排序
find /home -type f -size +10M -exec du -h {} \; | sort -hr
- 批量修改文件
# 批量重命名
find . -name "*.jpeg" -exec rename 's/\.jpeg$/\.jpg/' {} \;
# 批量修改权限
find /var/www -type f -exec chmod 644 {} \;
find /var/www -type d -exec chmod 755 {} \;
- 安全检测
# 查找所有可执行文件
find /home -type f -perm -u=x
# 查找SUID/SGID文件
find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null
# 查找所有人可写的文件
find / -type f -perm -o=w ! -type l 2>/dev/null
六、性能优化技巧
# 1. 限制搜索深度
find /home -maxdepth 2 -name "*.txt"
find /var -mindepth 2 -name "*.conf"
# 2. 跳过特定目录(prune)
find /home -path "*/node_modules" -prune -o -name "*.js" -print
# 3. 将最可能排除的条件放在前面
find / -type f -name "*.log" -size +10M # 好的顺序
find / -name "*.log" -type f -size +10M # 可能较慢
七、注意事项
权限问题:可能需要 sudo 权限搜索系统目录
性能影响:在全盘搜索时可能消耗大量资源
通配符转义:使用通配符时用引号括起来
安全操作:使用 -ok 或先测试再执行危险操作
八、高级用法
# 使用正则表达式
find . -regex ".*\.\(txt\|pdf\)$"
# 按inode号查找
find / -inum 123456 -print 2>/dev/null
# 查找并压缩
find /var/log -name "*.log" -mtime +30 -exec gzip {} \;
# 查找硬链接
find /home -samefile /path/to/file