#!/bin/bash # ============================================= # 海外服务器:打包压缩当日 data/raw/ 下的所有文件 # ============================================= # 用法:./scripts/overseas_pack.sh [日期] # 不传日期则使用当前新闻日(基于 day_cutoff_hour) # ============================================= set -euo pipefail # 从 system.yaml 读取配置(有默认值兜底) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/_load_config.sh" PROJECT_DIR="${CRAWL_PROJECT_DIR}" DATA_DIR="$PROJECT_DIR/data/raw" PACK_TMP="${SYNC_PACK_DIR:-/tmp}" SENTINEL_FILE="${SYNC_SENTINEL}" # ── 确定新闻日 ────────────────────────────────────── if [ $# -ge 1 ]; then NEWS_DAY="$1" else # 从 system.yaml 读取 cutoff hour CUTOFF=$(python3 -c " import yaml with open('$PROJECT_DIR/configs/system.yaml') as f: cfg = yaml.safe_load(f) print(cfg.get('schedule', {}).get('day_cutoff_hour', 6)) " 2>/dev/null || echo 6) HOUR=$(date +%H) if [ "$HOUR" -lt "$CUTOFF" ]; then NEWS_DAY=$(date -d "yesterday" +%Y%m%d) else NEWS_DAY=$(date +%Y%m%d) fi fi echo "[$(date)] 新闻日: $NEWS_DAY" # ── 检查数据是否存在 ───────────────────────────────── if [ ! -d "$DATA_DIR" ]; then echo "[$(date)] WARNING: data/raw/ 不存在,跳过打包" exit 0 fi # 计算今天目录下的总文件数(排除 tar.gz 和 sentinel) TOTAL_FILES=$(find "$DATA_DIR" -path "*/$NEWS_DAY/*" -type f ! -name "*.tar.gz" 2>/dev/null | wc -l) if [ "$TOTAL_FILES" -eq 0 ]; then echo "[$(date)] WARNING: 新闻日 $NEWS_DAY 无数据文件,跳过打包" exit 0 fi # ── 打包压缩 ───────────────────────────────────────── PACK_FILE="$PACK_TMP/en_news_${NEWS_DAY}.tar.gz" echo "[$(date)] 打包 $TOTAL_FILES 个文件 → $PACK_FILE ..." # 收集当天的所有数据文件(包括任意源下面的日期目录) find "$DATA_DIR" -path "*/$NEWS_DAY/*" -type f ! -name "*.tar.gz" 2>/dev/null \ | tar czf "$PACK_FILE" -T - --transform='s|.*/data/raw/||' 2>/dev/null PACK_SIZE=$(du -h "$PACK_FILE" | cut -f1) echo "[$(date)] 打包完成: $PACK_FILE ($PACK_SIZE)" # ── 生成哨兵文件 ───────────────────────────────────── echo "$NEWS_DAY $(date -Iseconds) $PACK_SIZE ($TOTAL_FILES files)" > "$SENTINEL_FILE" echo "[$(date)] 哨兵文件已更新: $SENTINEL_FILE" echo "[$(date)] ✅ 海外打包完成"