自动化脚本之文件搜索显示

简介: 自动化脚本之文件搜索显示

当时写这个脚本的初衷是因为, 调试Android和Linux系统下的sys proc 等 比如我想拿到gpio 或者 某些参数的信息 , 我就懒得找了, 通过脚本就可以把我需要的信息抓出来。

功能很复杂 当时调老半天了。

文件搜索显示脚本

脚本功能介绍

这个脚本是用来搜索和显示指定路径下的文件的。它接受一个必选参数,就是要搜索的路径,以及一些可选参数,用来控制输出和过滤的方式。它会根据参数的设置,使用find和grep命令来查找符合条件的文件,并使用cat或highlight命令来显示文件内容。它还会检查文件路径是否为安全目录,以避免访问一些敏感或危险的文件。

#!/bin/bash
 
# 文件路径过滤列表
FILTER_DIRS=(
    "^/proc/"
    "^/dev/"
)
1.支持文件路径过滤列表
2.支持stat打印文件信息
3.支持递归遍历子目录,默认为递归
 
VERSION="1.0.1"
print_path=1  # 是否打印文件路径,默认为打印
use_less=0  # 是否使用 less 命令,默认为不使用
recursive=0  # 是否递归遍历子目录,默认为不递归
file_filter=""  # 正则表达式匹配模式
search_keyword=""  # 文件内容搜索关键字
 
while getopts ":pnrf:s:" opt; do
  case ${opt} in
    p )
        print_path=0
        ;;
    n )
        use_less=1
        ;;
    r )
        recursive=1
        ;;
    f )
        file_filter="$OPTARG"
        ;;
    s )
        search_keyword="$OPTARG"
        ;;
    \? )
        echo "Invalid option: -$OPTARG" 1>&2
        exit 1
        ;;
    : )
        echo "Option -$OPTARG requires an argument." 1>&2
        exit 1
        ;;
  esac
done
shift $((OPTIND -1))
 
path="$1"
 
if [ -z "$path" ]; then
    echo "Usage: $0 [-p] [-n] [-r] [-f filter] [-s keyword] path"
    echo "Options:"
    echo "  -p : Do not print file paths."
    echo "  -n : Use cat command instead of less command."
    echo "  -r : Recursively search subdirectories."
    echo "  -f filter : Only show files matching the regular expression pattern."
    echo "  -s keyword : Search files with the specified keyword in their content."
    exit 1
fi
 
# 检查路径是否存在
if [ ! -e "$path" ]; then
    echo "Invalid file or directory: $path"
    exit 1
fi
 
# 检查是否为目录
if [ ! -d "$path" ]; then
    # 检查是否为字符设备文件
    if [[ $(stat -c %F "$path") == *"character special file"* ]]; then
        # 字符设备文件,使用 cat 命令读取文件内容并设置行数限制
  echo "$(stat  "$path")"
        cat "$path" | head -n 1000
    else
        # 其他类型的文件,使用 cat 命令输出文件内容
  echo "$(stat  "$path")"
        cat "$path"
    fi
    exit 0
fi
 
# 检查是否为安全目录
function is_safe_dir() {
    local dir_path=$1
    for dir in "${FILTER_DIRS[@]}"; do
        if [[ "$dir_path" =~ $dir ]]; then
            return 1
        fi
    done
    return 0
}
 
filter_regex=""
if [ -n "$file_filter" ]; then
  filter_regex=$(echo "$file_filter" | sed 's/,/\\\|/g')
fi
 
function search_files() {
    local search_path=$1
    local output=""
    local find_cmd="find $search_path -type f"
    if [ -n "$filter_regex" ]; then
  find_cmd+=" -regex '.*\\.($filter_regex)\$'"
    fi
 
    if [ -n "$search_keyword" ]; then
        find_cmd+=" -exec grep -E --color=always -s -n -i \"$search_keyword\" {} +"
    else
        find_cmd+=" -print0"
    fi
 
    while IFS= read -r -d $'\0' file; do
        # 检查是否为安全文件
        if ! is_safe_dir "$(dirname "$file")"; then
            continue
        fi
 
        if [ -n "$search_keyword" ]; then
            grep_result=$(grep -E --color=always -s -n -i "$search_keyword" "$file")
            if [ -n "$grep_result" ]; then
                if [ "$print_path" -eq 1 ]; then
                    output+="$file\n"
                fi
                output+="$grep_result\n"
            fi
        else
            if [ $(stat -c %s "$file") -gt 5242880 ]; then
                printf "The file %s is too large, use cat instead of less? (y/n) " "$file"
                read -r choice
                if [ "$choice" = "y" ]; then
                    output+="$file\n$(cat "$file")\n"
                else
                    output+="$file\n$(highlight -l "$file")\n"
                fi
            else
                if [ "$print_path" -eq 1 ]; then
                    output+="$file\n"
                fi
                output+="$(cat "$file")\n"
            fi
        fi
    done < <($find_cmd)
    echo "$output"
}
 
# 获取匹配到的文件列表
if [ "$recursive" -eq 1 ]; then
    files=$(search_files "$path")
else
    files=$(search_files "$path" | grep "^$path")
fi
 
# 输出匹配到的文件列表及文件内容
if [ "$use_less" -eq 1 ]; then
    echo "$files" | cat
else
    echo "$files"
fi

使用示例

要运行这个脚本,需要在终端中输入:

bash search_file.sh [-p] [-n] [-r] [-f filter] [-s keyword] path

其中:

  • -p : 不打印文件路径。
  • -n : 使用cat命令而不是less命令。
  • -r : 递归搜索子目录。
  • -f filter : 只显示匹配正则表达式模式的文件。
  • -s keyword : 搜索文件内容中包含关键字的文件。

例如:

bash search_file.sh /home/user # 显示/sys/kernel目录下的所有文件
bash search_file.sh -r /home/user # 递归显示/sys/kernel目录及其子目录下的所有文件
bash search_file.sh -f txt,csv /home/user # 只显示/sys/kernel目录下的txt和csv文件
bash search_file.sh -s hello /home/user # 搜索/sys/kernel目录下内容中包含gpio的文件

然后就可以看到类似下面的输出(假设的下面打印只是我瞎写的,实际上功能很复杂):

/home/user/file1.txt
This is a text file.
Hello world!
 
/home/user/file2.csv
name,age,gender
Alice,20,female
Bob,25,male
 
/home/user/file3.sh
#!/bin/bash
echo "Hello, this is a shell script."
相关文章
|
2天前
|
Linux Shell Perl
自动化脚本之Debian 开机时运行通过expect自动执行串口命令
自动化脚本之Debian 开机时运行通过expect自动执行串口命令
22 0
|
2天前
|
JSON 监控 测试技术
Groovy脚本编写员工上网行为监控自动化测试
本文介绍了如何使用Groovy脚本创建一个自动化工具来监控员工的网络活动。通过编写简单脚本记录员工访问的网站并打印信息,可进一步扩展为将数据保存至数据库。此外,通过设定定时任务,实现了每30分钟自动监控一次的功能。最后,展示了如何将监控数据转换为JSON格式并使用HTTP POST请求提交到网站,以实现数据的自动化上报,有助于企业保障网络安全、保护数据并提升工作效率。
57 5
|
2天前
|
JavaScript 前端开发
Playwright执行 JavaScript 脚本:探索浏览器自动化的新境界
在Web自动化中,Playwright提供`page.evaluate()`和`page.evaluate_handle()`来执行JavaScript脚本。`page.evaluate()`返回脚本执行结果,而`page.evaluate_handle()`返回JSHandle。示例展示了如何使用它们,如打印网页标题、操作元素及获取页面内容。通过这些方法,可以处理常规方法难以操作的网页元素。
10 2
|
2天前
|
Python
Python自动化办公实战案例:文件整理与邮件发送
Python自动化办公实战案例:文件整理与邮件发送
8 0
|
2天前
|
测试技术 API 开发者
使用 Playwright 脚本录制简化自动化测试:完全指南
Playwright提供了一种脚本录制功能,帮助开发者通过交互式操作自动生成测试脚本,提升测试效率。使用Playwright的命令行工具`codegen`,如`playwright codegen python &lt;url&gt;`,可以记录浏览器操作并生成Python测试脚本。生成的脚本使用Playwright API模拟用户交互,如`page.click()`和`page.fill()`。这种方法简化了自动化测试脚本的编写,促进了测试流程的加速。
7 1
|
2天前
|
IDE 测试技术 开发工具
从零开始:使用 Playwright 脚本录制实现自动化测试
Playwright提供了一种便捷的脚本录制功能,类似于Selenium IDE。通过运行`playwright codegen`命令,你可以启动一个浏览器并记录你的操作,生成Python或异步代码。在示例中,展示了如何录制登录百度的过程,生成的代码可以直接用于自动化测试。Playwright Inspector允许你编辑和转换测试代码,支持生成Pytest格式的测试用例,方便Python开发者使用。这个功能使Playwright成为强大的Web自动化测试工具。
10 3
|
2天前
|
SQL 关系型数据库 MySQL
【简单无脑】自动化脚本一键安装虚拟机下的MySQL服务
该文章提供了在虚拟机上安装MySQL服务的简化方法,特别是针对新手。作者提供了一个自动化脚本`install_mysql.sh`,使得安装过程更简单。用户需要下载`install.rpm`资源,将其放在指定目录下,然后创建并编辑脚本文件,将提供的代码粘贴进去,通过`chmod u+x`授权,最后运行脚本`./install_mysql.sh [rpm文件路径]`来安装MySQL。文章还附有相关图片说明。
30 1
【简单无脑】自动化脚本一键安装虚拟机下的MySQL服务
|
2天前
|
SQL 缓存 关系型数据库
MySQL常见问题解决和自动化安装脚本
这篇内容包含了两个主要部分:解决MySQL登录问题和处理GPG密钥问题。当MySQL密码正确但无法登录时,可以通过执行SQL命令`ALTER USER`和`flush privileges`来修改和重置密码。对于MySQL安装时的GPG密钥错误,首先需要强制删除旧的MySQL仓库包,导入新的GPG公钥,然后安装MySQL服务器。如果遇到GPG检查错误,可以使用`--nogpgcheck`参数忽略检查来安装。最后,提供了一个自动化安装MySQL的脚本,用于检查旧版本、卸载残留、安装MySQL8并启动服务。
25 1
MySQL常见问题解决和自动化安装脚本
|
2天前
|
弹性计算 运维 Shell
|
2天前
|
存储 弹性计算 运维
自动化收集员工信息的Shell脚本
【4月更文挑战第30天】
14 0

热门文章

最新文章