tool-merge-sql.sh 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/bin/bash
  2. # 递归合并SQL文件脚本
  3. # 检查命令行参数
  4. if [ $# -eq 0 ]; then
  5. # 如果没有参数,使用默认目录
  6. SOURCE_DIR="mysql"
  7. OUTPUT_FILE="merged.sql"
  8. else
  9. # 使用第一个参数作为源目录
  10. SOURCE_DIR="$1"
  11. # 使用第二个参数作为输出文件
  12. OUTPUT_FILE="$2"
  13. fi
  14. # 检查源目录是否存在
  15. if [ ! -d "${SOURCE_DIR}" ]; then
  16. echo "错误: 源目录 ${SOURCE_DIR} 不存在"
  17. exit 1
  18. fi
  19. # 清空或创建输出文件
  20. current_date=$(date)
  21. echo "-- 合并时间: ${current_date}" >"${OUTPUT_FILE}"
  22. echo "-- 合并目录: ${SOURCE_DIR}" >>"${OUTPUT_FILE}"
  23. echo "" >>"${OUTPUT_FILE}"
  24. # 递归查找所有SQL文件并合并
  25. find "${SOURCE_DIR}" -name "*.sql" | sort >sql_files.txt 2>/dev/null || true
  26. while IFS= read -r sql_file; do
  27. # 仅提取建表语句并添加到输出文件
  28. # 1. 只保留CREATE TABLE语句(从CREATE TABLE到ENGINE = InnoDB)
  29. # 2. 移除SQL注释
  30. # 3. 移除空行
  31. # 使用单个 stderr 重定向
  32. {
  33. awk '/CREATE TABLE IF NOT EXISTS/,/ENGINE = InnoDB/ {print}' "${sql_file}" |
  34. grep -v "BEGIN;" |
  35. grep -v "INSERT INTO" |
  36. grep -v "COMMIT;" |
  37. sed -e 's/--.*$//' | sed '/^[[:space:]]*$/d'
  38. } 2>/dev/null >>"${OUTPUT_FILE}" || true
  39. # 只在有内容输出时才添加空行分隔符
  40. if [ -s "${OUTPUT_FILE}" ]; then
  41. last_char=$(tail -c 1 "${OUTPUT_FILE}" 2>/dev/null || true)
  42. if [ "${last_char}" != "" ] && [ "${last_char}" != "\n" ]; then
  43. echo "" >>"${OUTPUT_FILE}"
  44. fi
  45. fi
  46. done <sql_files.txt
  47. # 清理临时文件
  48. rm -f sql_files.txt 2>/dev/null || true
  49. # 计算合并的文件数量
  50. file_count=0
  51. find "${SOURCE_DIR}" -name "*.sql" 2>/dev/null >file_list.txt || true
  52. while IFS= read -r _; do
  53. ((file_count++))
  54. done <file_list.txt
  55. rm -f file_list.txt 2>/dev/null || true
  56. echo ""
  57. echo "SQL文件合并完成!"
  58. echo "输出文件: ${OUTPUT_FILE}"
  59. echo "合并的文件数量: ${file_count}"
  60. echo ""