linux find命令

命令简介

find 命令是Linux系统中最强大和最常用的文件查找工具,用于在目录树中搜索文件,并可以对找到的文件执行指定的操作。它支持基于文件名、文件类型、大小、时间戳、权限等多种条件进行搜索。

语法

find [路径...] [表达式]

或者:

find [路径...] [选项] [操作]

常用选项和表达式

选项/表达式 说明
-name 模式 按文件名匹配(支持通配符)
-iname 模式 按文件名匹配(不区分大小写)
-type 类型 按文件类型查找(f-文件, d-目录, l-链接等)
-size 大小 按文件大小查找
-mtime 天数 按修改时间查找
-atime 天数 按访问时间查找
-user 用户名 按文件所有者查找
-group 组名 按文件所属组查找
-perm 权限 按文件权限查找
-exec 命令 {} 对找到的文件执行命令
-delete 删除找到的文件
-maxdepth 层数 指定搜索的最大目录深度

搜索条件详解

1. 时间条件
# 修改时间(mtime)
-mtime +7    # 7天前修改的文件
-mtime -1    # 1天内修改的文件
-mtime 7     # 正好7天前修改的文件

# 访问时间(atime)
-atime +30   # 30天前访问的文件

# 变化时间(ctime)
-ctime -2    # 2天内状态改变的文件
2. 大小条件
# 文件大小
-size +100M    # 大于100MB的文件
-size -10k     # 小于10KB的文件
-size 50M      # 正好50MB的文件

# 单位:c-字节, k-千字节, M-兆字节, G-吉字节
3. 权限条件
# 权限匹配
-perm 644        # 权限正好是644的文件
-perm -644       # 权限包含644所有位的文件
-perm /644       # 权限包含644任意位的文件
-perm /u=x,g=x   # 用户或组有执行权限的文件

基本用法

1. 按文件名查找
# 在当前目录查找名为file.txt的文件
find . -name "file.txt"

# 在/home目录查找所有.conf文件
find /home -name "*.conf"

# 不区分大小写查找
find /var -iname "*.LOG"
2. 按文件类型查找
# 查找所有目录
find /path -type d

# 查找所有普通文件
find /path -type f

# 查找所有符号链接
find /path -type l

# 查找所有套接字文件
find /path -type s
3. 按时间查找
# 查找7天内修改的文件
find /home -mtime -7

# 查找30天前访问的文件
find /var/log -atime +30

# 查找今天修改的文件
find . -mtime 0
4. 按大小查找
# 查找大于100MB的文件
find /home -size +100M

# 查找小于1KB的文件
find . -size -1k

# 查找空文件和空目录
find /tmp -empty
5. 按用户和权限查找
# 查找属于用户alice的文件
find /home -user alice

# 查找属于组developers的文件
find /var -group developers

# 查找有写权限的文件
find . -perm -o=w

# 查找SUID文件
find /usr -perm -4000

实际应用场景

场景1:系统清理
# 查找并删除7天前的临时文件
find /tmp -type f -mtime +7 -delete

# 查找并删除超过100MB的日志文件
find /var/log -name "*.log" -size +100M -exec rm -f {} \;

# 查找空目录并删除
find /path/to/clean -type d -empty -delete
场景2:备份管理
# 查找今天修改的文件并打包备份
find /home -type f -mtime -1 -exec tar -rf backup.tar {} \;

# 查找30天前的备份文件并压缩
find /backup -name "*.tar" -mtime +30 -exec gzip {} \;

# 查找特定类型的文件并复制到备份目录
find /project -name "*.java" -exec cp {} /backup/source_code/ \;
场景3:安全审计
# 查找所有可执行文件
find /home -type f -perm /111

# 查找SUID/SGID文件
find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null

# 查找世界可写文件
find / -type f -perm -0002 ! -type l 2>/dev/null

# 查找没有所有者的文件
find / -nouser -o -nogroup 2>/dev/null
场景4:项目开发
# 查找所有Python文件并统计行数
find . -name "*.py" -exec wc -l {} +

# 查找包含特定文本的文件
find . -name "*.java" -exec grep -l "TODO" {} \;

# 查找并修改文件权限
find . -name "*.sh" -exec chmod +x {} \;

# 查找大文件并排序
find . -type f -size +10M -exec ls -lh {} \; | sort -k5 -hr

高级用法

1. 组合条件搜索
# AND条件:查找7天内修改的.txt文件
find . -name "*.txt" -mtime -7

# OR条件:查找.py或.java文件
find . \( -name "*.py" -o -name "*.java" \)

# NOT条件:查找不是目录的文件
find . ! -type d

# 复杂组合:查找大于1MB且7天内修改的非备份文件
find /home -size +1M -mtime -7 ! -name "*backup*"
2. 使用-exec执行复杂命令
# 对每个找到的文件执行命令({}会被文件名替换)
find . -name "*.tmp" -exec rm -f {} \;

# 使用+代替\;可以提高效率(多个文件一次处理)
find . -name "*.jpg" -exec cp {} /backup/images/ +

# 在命令中使用文件名部分
find . -name "*.log" -exec mv {} {}.old \;

# 执行复杂脚本
find /var/log -name "*.log" -size +10M -exec sh -c 'echo "{}: $(wc -l < {}) lines"' \;
3. 使用xargs配合find
# 使用xargs处理find结果(处理包含空格的文件名要小心)
find . -name "*.txt" | xargs rm -f

# 安全的方式:使用-print0和xargs -0
find . -name "*.txt" -print0 | xargs -0 rm -f

# 限制每次处理的文件数
find . -name "*.jpg" -print0 | xargs -0 -n 10 cp -t /backup/
4. 性能优化技巧
# 限制搜索深度
find . -maxdepth 2 -name "*.conf"

# 从特定目录开始搜索,避免全盘扫描
find /home/user/project -name "*.java"

# 先使用更高效的条件过滤
find /var -type f -name "*.log" -size +1M

# 避免权限错误信息
find / -name "file.txt" 2>/dev/null

# 使用locate进行快速文件名搜索(需要updatedb)
locate "file.txt"

特殊功能

1. 使用-regex进行正则匹配
# 使用正则表达式匹配文件名
find . -regex ".*\.\(txt\|log\)$"

# 不区分大小写的正则匹配
find . -iregex ".*\.\(jpg\|jpeg\|png\)$"
2. 使用-prune排除目录
# 排除.git目录
find . -name ".git" -prune -o -type f -print

# 排除多个目录
find . \( -name ".git" -o -name "node_modules" \) -prune -o -type f -print

# 排除目录但包含特定文件
find . -name "test" -prune -o -name "*.js" -print
3. 格式化输出
# 显示文件详细信息
find . -name "*.txt" -ls

# 自定义输出格式
find . -name "*.jpg" -printf "%p - %s bytes - %Tb %Td %TH:%TM\n"

# 只显示文件名(每行一个)
find . -name "*.py" -print

注意事项

  • 使用-delete选项时要特别小心,建议先不加-delete运行确认结果
  • 在根目录/运行find可能很慢,尽量指定具体路径
  • 使用-exec时,{}会被替换为文件名,以\;结束命令
  • 文件名包含空格时,使用-print0xargs -0更安全
  • find不会跟随符号链接到目录,除非使用-L选项
  • 在生产环境中使用破坏性操作前,务必先测试