#!/usr/bin/env bash set -euo pipefail # 外部必须导出: # INPUT_ROOT WORKFLOW_ID SUB_DIR OUTPUT_ROOT INPUT_ROOT="${INPUT_ROOT}/${WORKFLOW_ID}" INPUT_DIR="${INPUT_ROOT}/${SUB_DIR}" # 实际指向 bagdir_splits 上一级 OUTPUT_DIR="${OUTPUT_ROOT}" # 通常就是 /nas_perception/.../output/wfxxx log(){ echo "[$(date '+%F %T')] [$$] $*" } #---------------------------------------------------------- # 统一封装:目录同步 / 文件拷贝 #---------------------------------------------------------- sync_dir(){ local srcDir="$1" dstDir="$2" if [[ -d ${srcDir} ]]; then log " + $(basename "${srcDir}")/" mkdir -p "${dstDir}" rsync -a --delete "${srcDir}/" "${dstDir}/" fi } sync_file(){ local srcFile="$1" dstDir="$2" if [[ -f ${srcFile} ]]; then log " + $(basename "${srcFile}")" mkdir -p "${dstDir}" cp -p "${srcFile}" "${dstDir}/" fi } #---------------------------------------------------------- # 主逻辑 #---------------------------------------------------------- log "Script started" log "INPUT_DIR = ${INPUT_DIR}" log "OUTPUT_DIR = ${OUTPUT_DIR}" [[ -d ${INPUT_DIR} ]] || { log "ERROR: INPUT_DIR not found: ${INPUT_DIR}"; exit 1; } while IFS= read -r -d '' src; do # 去掉 split_N 层级,得到纯 bag.dir 名 rel="${src#${INPUT_DIR}/*/}" dest="${OUTPUT_DIR}/${rel}/derived/${SUB_DIR}" mkdir -p "${dest}" basename_bag=$(basename "$src") # xxx.bag.dir pkgname="${basename_bag%.bag.dir}" # xxx split_name=$(basename "$(dirname "$src")") # split_0 / split_1 / ... truth_root="${INPUT_DIR}/${split_name}" log "==================== Processing ${pkgname} ===================" # 1. 老 object 重命名同步 sync_dir "${src}/object_det_ep20" "${dest}/object_det_al" sync_dir "${src}/object_tracking" "${dest}/object_tracking_al" # 2. 目录类:slam + lidar_gt + 新增 6 目录 for item in slam_lidar_ground slam_lidar_none_ground \ lidar_gt_pandar128_5f_front lidar_gt_pandar128_5f_rear \ object_det_ep20_lrgt_front object_det_ep20_lrgt_rear \ object_lrgt_filter object_postprocess; do sync_dir "${src}/${item}" "${dest}/${item}" done # 3. 文件类 for item in bev_image_ground.png ego_motion_slam_lidar.csv; do sync_file "${src}/${item}" "${dest}" done # 4. osm & split_json(源在 OUTPUT_ROOT/SUB_DIR/split_N/) osm_src="${truth_root}/osm_out/${pkgname}.osm" if [[ -f ${osm_src} ]]; then log " + ${pkgname}.osm -> input bag.dir" cp -p "${osm_src}" "${src}/" log " + ${pkgname}.osm -> output" cp -p "${src}/${pkgname}.osm" "${dest}/" fi split_src="${truth_root}/split_json/${pkgname}" if [[ -d ${split_src} ]]; then log " + split_json/ -> input bag.dir" rsync -a --delete "${split_src}/" "${src}/split_json/" log " + split_json/ -> output" sync_dir "${src}/split_json" "${dest}/split_json" fi # 5. 2dseg and occ sync_dir "${src}/${SUB_DIR}" "${dest}" done < <(find "${INPUT_DIR}" -mindepth 2 -maxdepth 2 -type d -name '*.bag.dir' -print0) log "============================================================" log "All done, success!"