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

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

当时写这个脚本的初衷是因为, 调试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."
相关文章
|
27天前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
20天前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
26 7
|
18天前
|
运维 Kubernetes Devops
自动化运维:从脚本到工具的演进之旅
在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
26天前
|
SQL 测试技术 API
如何编写API接口的自动化测试脚本
本文详细介绍了编写API自动化测试脚本的方法和最佳实践,涵盖确定测试需求、选择测试框架、编写测试脚本(如使用Postman和Python Requests库)、参数化和数据驱动测试、断言和验证、集成CI/CD、生成测试报告及维护更新等内容,旨在帮助开发者构建高效可靠的API测试体系。
|
23天前
|
运维 Devops
自动化运维:从脚本到DevOps的进化之旅
在数字化时代,自动化运维不仅是提高生产效率的关键,更是企业竞争力的象征。本文将带领读者穿越自动化运维的发展历程,从最初的脚本编写到现代DevOps文化的形成,揭示这一演变如何重塑IT行业的工作模式。通过具体案例,我们将展示自动化工具和实践如何简化复杂任务,优化流程,并促进团队协作。你将发现,自动化运维不仅关乎技术的进步,更体现了人、流程和技术三者之间协同增效的深层逻辑。
|
25天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
28天前
|
机器学习/深度学习 人工智能 运维
自动化运维之路:从脚本到工具的演进
在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
|
1月前
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
|
1月前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
68 2
|
1月前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
82 3
下一篇
DataWorks