提升搜索效率与精度 Linux文件搜索命令全解析

Linux 文件搜索命令全解析(提升搜索效率与精度)

三类工具分工:

  • find:实时、强大、按各种条件搜(最常用)
  • locate:数据库秒级搜(快但不是实时)
  • which / whereis / type:找命令本身
  • grep:搜文件内容(不是搜文件名)

一、find 基础语法

find 搜索路径  [条件]  [动作]

不写路径默认当前目录;不写条件默认列出所有文件。

1. 按文件名搜索(最常用)

find /etc -name "*.conf"             # 区分大小写
find /etc -iname "*.Conf"             # 不区分大小写
find /var/log -name "*.log"
find /home -name "*.txt" -o -name "*.md"   # 或
find /tmp ! -name "*.sock"           # 取反

2. 按文件类型

find /path -type f        # 普通文件
find /path -type d        # 目录
find /path -type l        # 软链接
find /path -type s        # socket

3. 按大小

find / -size +100M        # 大于100M
find / -size -10k         # 小于10k
find / -size +500M -size -1G
# 单位:c字节 k M G

4. 按时间

# mtime 修改内容时间(天)
find /var/log -mtime +7          # 7天前
find /var/log -mtime -1          # 24小时内
find /var/log -mmin +30          # 30分钟前

# atime 访问时间 / ctime 状态改变时间
find /etc -ctime -1

5. 按属主 / 属组

find /home -user zhangsan
find /home -group developers
find / -nouser                  # 属主已被删除的文件(垃圾文件)

6. 按权限

find / -perm 644                # 精确等于644
find / -perm -4000              # 带SUID的文件(安全排查)
find /tmp -perm -o=w            # 其他人可写

二、find 找到后执行动作

-exec(最经典)

# 找到后 ls -lh 看大小
find /var/log -name "*.log" -exec ls -lh {} \;

# 删掉7天前日志
find /var/log/app -name "*.log" -mtime +7 -exec rm -f {} \;

# 批量改权限
find /web -type f -exec chmod 644 {} \;
find /web -type d -exec chmod 755 {} \;

{} 代表找到的文件,\; 是结束符(前面有空格)。

-delete(简单删除)

find /tmp -name "*.tmp" -delete

用 xargs(更快,批量处理)

# 找出大文件并列出
find / -xdev -type f -size +500M -print0 | xargs -0 ls -lh

# 统计总大小
find /var/log -name "*.log" -print0 | xargs -0 du -ch

-print0 + xargs -0 处理文件名含空格 / 换行的情况,安全写法。

三、locate:数据库秒搜

yum install mlocate -y
updatedb                 # 立即更新数据库
locate nginx.conf        # 秒出结果
locate -i *.py           # 不区分大小写
locate -n 20 *.log       # 只看前20条

特点:

  • 比 find / -name 快几个数量级
  • 缺点:不是实时,数据库每天由 cron 更新一次;新文件找不到就 updatedb
  • 适合按文件名模糊查找

四、找命令本身

which nginx             # 可执行文件路径
whereis nginx           # 命令+源码+man手册
type cd                 # 判断是内建命令还是外部文件
type ll
compgen -c              # 列出所有可执行命令

五、按内容搜文件:grep 配合 find

# 在所有py文件里搜"password"
grep -rn "password" /etc --include="*.conf"

# 找包含某关键字的配置文件
grep -rl "listen 80" /etc/nginx/

# find + grep 组合
find /var/www -name "*.php" -exec grep -l "mysql_connect" {} \;

六、高级组合技巧

1. 多条件 AND / OR

# 大于100M 且 是.log
find /var -type f -size +100M -name "*.log"

# .txt 或 .md
find /docs -name "*.txt" -o -name "*.md"
# 注意优先级,OR 组合要加括号
find /docs \( -name "*.txt" -o -name "*.md" \) -size +1M

2. 排除目录

find / -path /proc -prune -o -name "*.log" -print
find / -path /proc -prune -o -path /sys -prune -o -name "*.conf" -print

3. 查磁盘大文件(生产排障必用)

# 根分区下找大于500M的文件
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h

-xdev 不跨文件系统,避免扫到挂载的别的盘。

4. 找最近修改的配置文件

find /etc -mtime -1 -type f

5. 找 SUID 高危文件(安全检查)

find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

七、性能建议

  1. 别在 / 下裸跑 find / -name xxx:会扫 proc/sys 等虚拟文件系统,慢且报错一堆。加 2>/dev/null 屏蔽权限错误,或加 -xdev。
  2. 知道大概目录就缩小范围:find /etc 比 find / 快几百倍。
  3. 模糊查找用 locate:文件名记得个大概,先 locate,比 find 快。
  4. 删除操作用 -delete 或先 ls 确认:
# 先看要删什么
find /var/log/app -name "*.log" -mtime +7 -ls
# 确认无误再删
find /var/log/app -name "*.log" -mtime +7 -delete

八、一行实战

1. 找出磁盘占用最大的 10 个文件

find / -xdev -type f -size +100M -exec du -h {} \; 2>/dev/null | sort -rh | head -10

2. 批量把 .txt 改成 .md

find . -name "*.txt" -exec bash -c 'mv "$1" "${1%.txt}.md"' _ {} \;

3. 清空所有大于 100M 的日志

find /var/log -name "*.log" -size +100M -exec truncate -s 0 {} \;

4. 找今天改过的所有文件

find /home -type f -mtime -1

5. 找空文件 / 空目录

find /tmp -type f -empty
find /tmp -type d -empty

九、常见问题

  1. find 报一堆 Permission denied:加 2>/dev/null 屏蔽。
  2. 中文文件名乱码:export LANG=C.UTF-8。
  3. 文件名带空格:用 find -print0 | xargs -0,不要直接 xargs。
  4. locate 找不到新文件:先 updatedb。
  5. find 在 NFS / 挂载点慢:加 -xdev 或先 df -h 确认挂载点。
  6. -exec vs xargs:文件少时 -exec 直观;文件多时 xargs 快(批量调用)。

十、速查表

表格

需求命令
按名字find /path -name "*.log"
按大小find / -size +100M
按时间find / -mtime +7
按属主find /home -user zhangsan
找后删除find ... -delete
找后执行find ... -exec cmd {} \;
秒搜locate filename
找命令which / whereis
找内容grep -rn "关键词" 目录
大文件find / -xdev -size +500M
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像-次元社
欢迎您留下宝贵的见解!
提交
头像-次元社

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容