#!/usr/bin/env bash
# keep_per_prefix_latest5.sh
# 规则：<prefix>-YYYYMMDD-HHMMSS.archive.gz
# 动作：对每个 prefix 仅保留按文件名时间戳最新的 5 个

set -Eeuo pipefail

US=$'\x1F'  # 字段分隔符，文件名中不会出现
# 生成记录：prefix US timestamp US filename NUL
find . -maxdepth 1 -type f -name '*.archive.gz' -printf '%P\0' \
| while IFS= read -r -d '' f; do
    # 捕获：prefix 与 8位日期-6位时间
    if [[ $f =~ ^(.*)-([0-9]{8}-[0-9]{6})\.archive\.gz$ ]]; then
        printf '%s%s%s%s%s\0' "${BASH_REMATCH[1]}" "$US" "${BASH_REMATCH[2]}" "$US" "$f"
    fi
  done \
| sort -z -t "$US" -k1,1 -k2,2r \
| bash -c '
    set -Eeuo pipefail
    US=$'\''\x1F'\''
    declare -A count
    # 读取排序后的记录，前 5 个保留，之后输出待删除的文件名
    while IFS="$US" read -r -d "" prefix ts file; do
        c=${count["$prefix"]-0}
        if (( c < 5 )); then
            count["$prefix"]=$((c+1))
        else
            printf "%s\0" "$file"
        fi
    done
' \
| xargs -0 -r rm -f --
