当时写这个脚本的初衷是因为, 调试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."