You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:09:23