| 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" | |