File size: 1,507 Bytes
2613ced | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #!/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"
|