| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/bin/bash
- # 递归合并SQL文件脚本
- # 检查命令行参数
- if [ $# -eq 0 ]; then
- # 如果没有参数,使用默认目录
- SOURCE_DIR="mysql"
- OUTPUT_FILE="merged.sql"
- else
- # 使用第一个参数作为源目录
- SOURCE_DIR="$1"
- # 使用第二个参数作为输出文件
- OUTPUT_FILE="$2"
- fi
- # 检查源目录是否存在
- if [ ! -d "${SOURCE_DIR}" ]; then
- echo "错误: 源目录 ${SOURCE_DIR} 不存在"
- exit 1
- fi
- # 清空或创建输出文件
- current_date=$(date)
- echo "-- 合并时间: ${current_date}" >"${OUTPUT_FILE}"
- echo "-- 合并目录: ${SOURCE_DIR}" >>"${OUTPUT_FILE}"
- echo "" >>"${OUTPUT_FILE}"
- # 递归查找所有SQL文件并合并
- find "${SOURCE_DIR}" -name "*.sql" | sort >sql_files.txt 2>/dev/null || true
- while IFS= read -r sql_file; do
- # 仅提取建表语句并添加到输出文件
- # 1. 只保留CREATE TABLE语句(从CREATE TABLE到ENGINE = InnoDB)
- # 2. 移除SQL注释
- # 3. 移除空行
- # 使用单个 stderr 重定向
- {
- awk '/CREATE TABLE IF NOT EXISTS/,/ENGINE = InnoDB/ {print}' "${sql_file}" |
- grep -v "BEGIN;" |
- grep -v "INSERT INTO" |
- grep -v "COMMIT;" |
- sed -e 's/--.*$//' | sed '/^[[:space:]]*$/d'
- } 2>/dev/null >>"${OUTPUT_FILE}" || true
- # 只在有内容输出时才添加空行分隔符
- if [ -s "${OUTPUT_FILE}" ]; then
- last_char=$(tail -c 1 "${OUTPUT_FILE}" 2>/dev/null || true)
- if [ "${last_char}" != "" ] && [ "${last_char}" != "\n" ]; then
- echo "" >>"${OUTPUT_FILE}"
- fi
- fi
- done <sql_files.txt
- # 清理临时文件
- rm -f sql_files.txt 2>/dev/null || true
- # 计算合并的文件数量
- file_count=0
- find "${SOURCE_DIR}" -name "*.sql" 2>/dev/null >file_list.txt || true
- while IFS= read -r _; do
- ((file_count++))
- done <file_list.txt
- rm -f file_list.txt 2>/dev/null || true
- echo ""
- echo "SQL文件合并完成!"
- echo "输出文件: ${OUTPUT_FILE}"
- echo "合并的文件数量: ${file_count}"
- echo ""
|