5.Linux文件搜索命令

七言 2025-8-1 8 8/1

[TOC]

Linux文件搜索

Linux文件搜索命令

find -查找目录下的文件

  • 根据多种条件(文件名、大小、时间、权限等)实时搜索文件系统,并能对搜索到的文件执行操作

语法

find [路径] [搜索条件] [执行操作]
  • 路径:指定搜索的起始目录(默认当前目录)

  • 搜索条件:按名称、类型、大小、时间、权限等过滤

  • 执行操作:对匹配文件执行的动作

  • 常用选项

参数 描述
-name 按文件名查找(区分大小写),支持通配符
-iname 文件名查找(不区分大小写),支持通配符
-type f 按文件类型搜索,f代表普通文件,d代表目录
-size 按文件大小搜索
-user 按文件所有者搜索
-mtime 时间单位为天,按文件修改时间筛选(+n 超过 n 天,-n n 天内,n 正好 n 天)
-atime 时间单位为天,按文件最后访问时间筛选
-ctime 时间单位为天,按文件最后修改时间筛选
-mmin 时间单位为分钟,按文件内容最后修改时间筛选
-exec 命令 {} \; 执行命令,{}:当前文件名的占位符 \;:命令结束符
-a 或空格 AND 与(默认)
-o OR
! NOT
\(条件 \) 组合条件
  • 按名称查找
# 查找当前目录下名为 "file.txt" 的文件
$ find . -name "file.txt"

# 忽略大小写查找所有 ".log" 文件
$ find /var/log -iname "*.log"
  • 按类型查找
# 查找所有目录(d表示目录,f表示文件,l表示符号链接)
$ find /home -type d -name "backup*"

# 查找所有空文件
$ find . -type f -empty
  • 按大小查找
# 查找大于 100MB 的文件(+表示大于,-表示小于)
$ find / -type f -size +100M

# 查找小于 1KB 的文件
$ find . -type f -size -1k
  • 按时间查找
# 查找 7 天内修改过的文件(mtime:修改时间,atime:访问时间,ctime:状态变更时间)
$ find /etc -type f -mtime -7

# 查找恰好 30 天前被访问的文件
$ find /var/log -type f -atime 30

# 查找 10 分钟内被修改的文件
$ find /tmp -type f -mmin -10
  • 按权限或所有者查找
# 查找权限为 644 的文件
$ find . -type f -perm 644

# 查找属于用户 "alice" 的文件
$ find /home -user alice
  • 执行操作(-exec 或 -delete)
# 删除所有扩展名为 ".tmp" 的文件(确认后再执行!)
$ find /tmp -type f -name "*.tmp" -delete

# 将找到的 ".log" 文件压缩为 ".gz"
$ find /var/log -type f -name "*.log" -exec gzip {} \;

# 查找并显示详细信息(-ls 等价于 ls -l)
$ find . -type f -size +1G -ls
  • 组合条件(与、或、非)
# 查找大于 10MB 且扩展名为 ".log" 的文件
$ find /var/log -type f -size +10M -name "*.log"

# 查找 7 天内修改过 或 属于用户 "bob" 的文件
$ find /data -type f \( -mtime -7 -o -user bob \)

# 查找非 ".txt" 结尾的文件
$ find . -type f ! -name "*.txt"

which -定位文件位置

  • $PATH 环境变量指定的路径中搜索可执行文件
  • 只返回第一个匹配的可执行文件

示例

# 查看 python 命令的实际位置
$ which python
/usr/bin/python

# 查看多个命令的位置
$ which ls grep mv rm
/bin/ls
/bin/grep
/bin/mv
/bin/rm

# 显示所有匹配结果 (-a 选项)
$ which -a python
/usr/bin/python
/home/user/miniconda3/bin/python

whereis -定位程序的多类型文件

  • whereis是搜索程序名,如果是一个普通的文件是找不到的

示例

$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

$ whereis python
python: /usr/bin/python3.8 /usr/bin/python /usr/lib/python3.8 ...
        /usr/include/python3.8 /usr/share/python ...
        /usr/share/man/man1/python.1.gz

grep -显示文件中的匹配行

  • 文本搜索工具,用于在文件或标准输入中按行查找匹配指定模式的字符串,并输出匹配行

语法

grep [选项] "模式" [文件...]
  • 常用选项
选项 说明 示例
-i 忽略大小写 grep -i "warning" log.txt
-v 反向匹配(显示不包含的行) grep -v "success" data.csv
-n 显示行号 grep -n "function" script.js
-c 显示匹配的行数 grep -c "404" access.log
-l 显示包含匹配项的文件名 grep -l "TODO" project/*
-L 显示不包含匹配项的文件名 grep -L "tested" *.py
-r / -R 递归搜索目录 grep -r "Configuration" /etc/
-w 整词匹配 grep -w "user" accounts.txt
-A n 显示匹配行及后n行 grep -A 3 "Exception" error.log
-B n 显示匹配行及前n行 grep -B 2 "FAILURE" test.out
-C n 显示匹配行前后各n行 grep -C 2 "core dumped" crash.log
-o 仅显示匹配部分 grep -o "user_[0-9]*" logs.txt
-E 使用扩展正则表达式 `grep -E "error | warn" app.log`
--color=auto 高亮显示匹配内容 grep --color "critical" alert.log
-m n 最多匹配次数 grep -m 10 "match" bigfile
-q 静默模式(用于脚本判断) if grep -q "found" file; then ...

示例

  • 基础搜索
# 在 file.txt 中查找包含 "error" 的行
$ grep "error" file.txt

# 从标准输入中查找(配合管道)
$ cat log.txt | grep "error"
  • 忽略大小写
# 查找 "hello"(不区分大小写)
$ grep -i "hello" file.txt
  • 显示匹配行的行号
# 显示匹配行及其行号
$ grep -n "success" file.txt
  • 反向匹配(排除)
# 查找不含 "debug" 的行
$ grep -v "debug" log.txt
  • 整词匹配(避免部分匹配)
# 查找完整包含 "main" 的行
$ grep -w "main" code.c
  • 递归搜索目录中的文件
# 在 `/var/log` 目录下递归查找包含 "warning" 的文件
$ grep -r "warning" /var/log
  • 显示匹配行及前后行(前后行行数不一致)
# 显示匹配行及匹配行的前2行(before)、后3行(after)
$ grep -A 3 -B 2 "exception" debug.log
  • 显示匹配行及前后行(前后行行数一致)
# 显示匹配行及前后 2 行
$ grep -C 2 "error" file.txt
  • 统计匹配行数
$ grep -c "failed" auth.log
  • 仅输出匹配的部分
# 仅显示匹配的字符串(每行匹配部分单独输出)
$ grep -o "error" file.txt

正则表达式示例

  • 基本正则表达式
# 查找以 "start" 开头的行
$ grep "^start" file.txt

# 查找以数字结尾的行
$ grep "[0-9]$" file.txt

# 查找包含 "error" 或 "fail" 的行
$ grep -E "error|fail" file.txt
  • 扩展正则表达式(使用 -E)
# 查找连续 2-3 个字母 "a"
$ grep -E "a{2,3}" file.txt

# 查找以 "abc" 或 "def" 开头的行
$ grep -E "^(abc|def)" file.txt

实战场景

  • 场景1:快速排查崩溃日志
# 查找最近崩溃的堆栈信息
$ grep -A 10 "Segmentation fault" /var/log/apport.log
  • 场景2:提取配置文件中有效配置
# 过滤掉注释和空行
$ grep -vE '^\s*(#|$)' nginx.conf
  • 场景3:结合 find 精准搜索
# 查找所有 Python 文件中包含 "import os" 的代码
$ find . -type f -name "*.py" -exec grep -l "import os" {} +

配合管道符|使用

  • 管道符将前一个命令的 标准输出(stdout) 作为后一个命令的 标准输入(stdin)

语法

命令A | grep [选项] "模式"
  • 高频示例
场景 命令拆解 作用
实时日志过滤 tail -f /var/log/nginx/access.log \| grep "404" 实时只看 404 请求
历史命令搜索 history \| grep "scp" 找出曾执行过的 scp 命令
进程筛选 ps aux \| grep "python" 只看含 python 的进程(但会多一条 grep 自身,见下方技巧)
端口占用 netstat -tunlp \| grep ":80" 查看监听 80 端口的服务
大文件列表 ls -lh \| grep "^-.*G" 列出以 G 为单位的大文件
统计失败登录 grep "Failed" /var/log/auth.log \| wc -l 先过滤再计数
排除 grep 自身 ps aux \| grep "[m]yapp" 用正则 [m] 避免匹配到 grep myapp 这一行
多级过滤 ps -ef \| grep "nginx" \| grep -v "grep" 一级过滤后再下级过滤,查找 nginx 进程并排除 grep 自身
  • 左边命令 标准输出(stdout) → 右边 grep 标准输入(stdin)
# 从 Apache 日志中查找包含 404 的错误记录
$ cat /var/log/apache/access.log | grep "404"

# 优化,避免使用 cat 
$ grep "404" /var/log/apache/access.log
- THE END -

七言

8月01日16:05

最后修改:2025年8月1日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论