#!/usr/bin/env bash set -euo pipefail SRC_BASE="/work/jf381/checkpoints" DST_BASE="/work/jf381/code/FST/checkpoints" # dry-run: 1 = print only; 0 = actually perform cp DRY_RUN=0 shopt -s nullglob for src_folder in "$SRC_BASE"/*; do [ -d "$src_folder" ] || continue foldername="$(basename "$src_folder")" echo "---- 处理: $foldername ----" # 找到匹配 recent_epoch_* 的条目(可能为文件或目录) matches=( "$src_folder"/recent_epoch_* ) # 如果没有真实匹配(保留 nullglob 行为),数组可能为单个字面匹配,检查并跳过 if [ ${#matches[@]} -eq 0 ] || { [ "${matches[0]##*/}" = "recent_epoch_*" ] && [ ${#matches[@]} -le 1 ]; }; then echo " 在 $src_folder 未找到 recent_epoch_*,跳过。" continue fi dest_recent_dir="$DST_BASE/$foldername" echo " 目标 recent 目录: $dest_recent_dir" if [ "$DRY_RUN" -ne 0 ]; then echo " (dry-run) 将创建: mkdir -p \"$dest_recent_dir\"" for m in "${matches[@]}"; do echo " (dry-run) 将复制: \"$m\" -> \"$dest_recent_dir/\"" done else mkdir -p "$dest_recent_dir" for m in "${matches[@]}"; do # 使用 cp -a 保留权限/时间戳/链接等 # 若目标已存在同名目录/文件,cp -a 会把源放到目标目录中(覆盖内部同名文件) echo " 复制: \"$m\" -> \"$dest_recent_dir/\"" cp -a -- "$m" "$dest_recent_dir/" done echo " 完成复制。" fi done echo "全部处理完毕. DRY_RUN=$DRY_RUN"