find 命令是Linux系统中最强大和最常用的文件查找工具,用于在目录树中搜索文件,并可以对找到的文件执行指定的操作。它支持基于文件名、文件类型、大小、时间戳、权限等多种条件进行搜索。
find [路径...] [表达式]
或者:
find [路径...] [选项] [操作]
# 修改时间(mtime)
-mtime +7 # 7天前修改的文件
-mtime -1 # 1天内修改的文件
-mtime 7 # 正好7天前修改的文件
# 访问时间(atime)
-atime +30 # 30天前访问的文件
# 变化时间(ctime)
-ctime -2 # 2天内状态改变的文件
# 文件大小
-size +100M # 大于100MB的文件
-size -10k # 小于10KB的文件
-size 50M # 正好50MB的文件
# 单位:c-字节, k-千字节, M-兆字节, G-吉字节
# 权限匹配
-perm 644 # 权限正好是644的文件
-perm -644 # 权限包含644所有位的文件
-perm /644 # 权限包含644任意位的文件
-perm /u=x,g=x # 用户或组有执行权限的文件
# 在当前目录查找名为file.txt的文件
find . -name "file.txt"
# 在/home目录查找所有.conf文件
find /home -name "*.conf"
# 不区分大小写查找
find /var -iname "*.LOG"
# 查找所有目录
find /path -type d
# 查找所有普通文件
find /path -type f
# 查找所有符号链接
find /path -type l
# 查找所有套接字文件
find /path -type s
# 查找7天内修改的文件
find /home -mtime -7
# 查找30天前访问的文件
find /var/log -atime +30
# 查找今天修改的文件
find . -mtime 0
# 查找大于100MB的文件
find /home -size +100M
# 查找小于1KB的文件
find . -size -1k
# 查找空文件和空目录
find /tmp -empty
# 查找属于用户alice的文件
find /home -user alice
# 查找属于组developers的文件
find /var -group developers
# 查找有写权限的文件
find . -perm -o=w
# 查找SUID文件
find /usr -perm -4000
# 查找并删除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
# 查找今天修改的文件并打包备份
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/ \;
# 查找所有可执行文件
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
# 查找所有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
# 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*"
# 对每个找到的文件执行命令({}会被文件名替换)
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"' \;
# 使用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/
# 限制搜索深度
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"
# 使用正则表达式匹配文件名
find . -regex ".*\.\(txt\|log\)$"
# 不区分大小写的正则匹配
find . -iregex ".*\.\(jpg\|jpeg\|png\)$"
# 排除.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
# 显示文件详细信息
find . -name "*.txt" -ls
# 自定义输出格式
find . -name "*.jpg" -printf "%p - %s bytes - %Tb %Td %TH:%TM\n"
# 只显示文件名(每行一个)
find . -name "*.py" -print
-delete选项时要特别小心,建议先不加-delete运行确认结果/运行find可能很慢,尽量指定具体路径-exec时,{}会被替换为文件名,以\;结束命令-print0和xargs -0更安全-L选项