#!/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 /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 /dev/null || true echo "" echo "SQL文件合并完成!" echo "输出文件: ${OUTPUT_FILE}" echo "合并的文件数量: ${file_count}" echo ""