编写Unix脚本:在tgz包中搜索文本/文件名并生成结果归档
没问题,我帮你写一个完全符合需求的Unix Shell脚本,它支持两种核心功能——在tgz归档内搜索文件内容,或者匹配文件名,并且会自动生成带时间戳的结果归档,保存到指定的用户目录下。
脚本代码
#!/bin/bash # 检查参数是否符合要求 if [ $# -lt 3 ]; then echo "使用方法:" echo " 1. 搜索文件内容: $0 \"要搜索的文本\" \"目标归档.tgz\" \"用户名\"" echo " 2. 搜索文件名: $0 -f \"文件名模式(支持通配符)\" \"目标归档.tgz\" \"用户名\"" exit 1 fi # 初始化变量 SEARCH_MODE="content" SEARCH_TERM="" ARCHIVE_FILE="" USER_NAME="" # 解析输入参数 if [ "$1" = "-f" ]; then SEARCH_MODE="filename" SEARCH_TERM="$2" ARCHIVE_FILE="$3" USER_NAME="$4" # 验证文件名搜索的参数数量 if [ $# -ne 4 ]; then echo "错误: 文件名搜索需要4个参数,请参考使用方法" exit 1 fi else SEARCH_MODE="content" SEARCH_TERM="$1" ARCHIVE_FILE="$2" USER_NAME="$3" fi # 检查目标归档文件是否存在 if [ ! -f "$ARCHIVE_FILE" ]; then echo "错误: 目标归档文件 $ARCHIVE_FILE 不存在!" exit 1 fi # 创建用户专属的结果目录 RESULT_DIR="/var/tmp/$USER_NAME" mkdir -p "$RESULT_DIR" if [ $? -ne 0 ]; then echo "错误: 无法创建结果目录 $RESULT_DIR,请检查权限" exit 1 fi # 生成唯一时间戳,避免结果文件重名 TIMESTAMP=$(date +"%Y%m%d_%H%M%S") RESULT_ARCHIVE="$RESULT_DIR/result_$TIMESTAMP.tgz" # 创建临时工作目录,用于解压归档 TMP_DIR=$(mktemp -d) if [ $? -ne 0 ]; then echo "错误: 无法创建临时工作目录" exit 1 fi # 脚本退出时自动清理临时目录 cleanup() { rm -rf "$TMP_DIR" } trap cleanup EXIT # 解压目标归档到临时目录 echo "正在解压归档文件 $ARCHIVE_FILE..." tar -xzf "$ARCHIVE_FILE" -C "$TMP_DIR" if [ $? -ne 0 ]; then echo "错误: 解压归档文件失败!" exit 1 fi # 执行搜索并收集匹配的文件 MATCHED_FILES=() echo "正在执行$SEARCH_MODE搜索: $SEARCH_TERM..." if [ "$SEARCH_MODE" = "content" ]; then # 递归搜索包含指定文本的文件,忽略错误输出 MATCHED_FILES=$(grep -r -l "$SEARCH_TERM" "$TMP_DIR" 2>/dev/null) else # 递归搜索匹配文件名模式的文件,忽略错误输出 MATCHED_FILES=$(find "$TMP_DIR" -type f -name "$SEARCH_TERM" 2>/dev/null) fi # 检查是否找到匹配文件 if [ -z "$MATCHED_FILES" ]; then echo "未找到任何匹配的文件!" exit 0 fi # 打包匹配的文件到结果归档(使用相对路径,避免包含临时目录路径) echo "正在生成结果归档 $RESULT_ARCHIVE..." tar -czf "$RESULT_ARCHIVE" -C "$TMP_DIR" $(echo "$MATCHED_FILES" | sed "s|^$TMP_DIR/||") if [ $? -eq 0 ]; then echo "成功生成结果归档: $RESULT_ARCHIVE" else echo "错误: 生成结果归档失败!" exit 1 fi
使用说明
文本内容搜索:
当你需要在归档的所有文件中查找包含指定文本的文件时,执行以下命令:./search_tgz.sh "你的搜索文本" "example.tgz" "john_doe"结果归档会保存到
/var/tmp/john_doe/result_20240520_143022.tgz(时间戳会自动生成)。文件名匹配搜索:
当你需要查找归档中匹配指定文件名的文件时,加上-f选项(支持通配符如*.log):./search_tgz.sh -f "*.txt" "example.tgz" "john_doe"匹配的文件会被打包到相同格式的结果归档中。
注意事项
- 确保你对
/var/tmp目录有读写权限,脚本会自动创建用户对应的子目录。 - 文件名搜索的通配符需要用引号包裹,避免Shell提前解析通配符。
- 脚本会在退出时自动清理临时解压的文件,不会留下残留文件。
内容的提问来源于stack exchange,提问作者MKONDKARI
相关产品推荐
相关产品推荐

