5.Linux文件搜索命令

七言 2025-8-1 100 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 条评论