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
sort 和 uniq 配合使用是非常经典的Linux/Unix命令组合,主要用于去重和统计。以下是常见的使用案例:
一、基础组合使用
- 基本去重
# 先排序,再去重(uniq要求输入必须已排序)
sort file.txt | uniq
# 直接去重并排序
sort -u file.txt # 等同于 sort | uniq
- 统计重复次数
# 显示每行出现的次数
sort file.txt | uniq -c
3 apple
2 banana
1 orange
- 仅显示重复行
# 显示重复的行
sort file.txt | uniq -d
# 显示重复的行及重复次数
sort file.txt | uniq -dc
- 仅显示不重复的行
# 显示只出现一次的行
sort file.txt | uniq -u
二、实际应用案例
案例1:统计日志IP访问次数
# 统计Nginx访问日志中IP出现次数,按次数降序排列
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 解析:
# 1. awk提取第一列(IP地址)
# 2. sort排序(uniq要求)
# 3. uniq -c统计次数
# 4. sort -nr按数字降序排列
案例2:查找重复文件
# 通过MD5查找重复文件
find . -type f -exec md5sum {} \; | sort | uniq -Dw32
# -D:显示所有重复行
# -w32:只比较前32字符(MD5值)
案例3:分析单词频率
# 统计文本中单词频率(前10)
cat document.txt | tr -s ' ' '\n' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -nr | head -10
案例4:检查配置文件中的重复项
# 检查SSH配置中的重复设置
cat /etc/ssh/sshd_config | grep -v "^#" | grep -v "^$" | sort | uniq -d
案例5:合并多个文件并去重
# 合并多个名单文件,去重保存
sort file1.txt file2.txt file3.txt | uniq > combined.txt
三、高级技巧
- 忽略大小写
# 忽略大小写进行去重统计
sort -f file.txt | uniq -ic
- 按特定字段去重
# 按第二列去重(保留第一行)
sort -t, -k2,2 data.csv | uniq -f1 --skip-chars=0
- 结合正则表达式
# 只检查前N个字符
sort file.txt | uniq -w5 # 只比较每行前5个字符
# 跳过前N个字符
sort file.txt | uniq -s2 # 跳过每行前2个字符
常用组合命令速查
# 最常见的统计排序组合
sort | uniq -c | sort -nr
# 去重并计数,按字母排序
sort | uniq -c | sort -k2
# 去重并计数,按计数排序
sort | uniq -c | sort -k1nr
# 检查重复,显示行号
sort file.txt | uniq -c | awk '$1 > 1'