chore: sync local latest state and repository cleanup
This commit is contained in:
93
scripts/ci/update-log-archive-index.sh
Executable file
93
scripts/ci/update-log-archive-index.sh
Executable file
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
ARCHIVE_ROOT="${ROOT_DIR}/logs/archive"
|
||||
OUTPUT_FILE="${ARCHIVE_ROOT}/README.md"
|
||||
GENERATED_AT="$(date '+%Y-%m-%d %H:%M:%S %Z')"
|
||||
|
||||
fmt_epoch() {
|
||||
local epoch="$1"
|
||||
date -d "@${epoch}" '+%Y-%m-%d %H:%M:%S'
|
||||
}
|
||||
|
||||
list_batches() {
|
||||
find "${ARCHIVE_ROOT}" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort -r
|
||||
}
|
||||
|
||||
if [[ ! -d "${ARCHIVE_ROOT}" ]]; then
|
||||
mkdir -p "${ARCHIVE_ROOT}"
|
||||
fi
|
||||
|
||||
{
|
||||
echo "# 日志归档索引"
|
||||
echo
|
||||
echo "本文件由 \`scripts/ci/update-log-archive-index.sh\` 自动生成。"
|
||||
echo
|
||||
echo "- 生成时间: ${GENERATED_AT}"
|
||||
echo "- 归档根目录: \`logs/archive/\`"
|
||||
echo
|
||||
|
||||
mapfile -t batches < <(list_batches)
|
||||
if [[ "${#batches[@]}" -eq 0 ]]; then
|
||||
echo "当前没有可用归档批次。"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "## 批次总览"
|
||||
echo
|
||||
echo "| 批次 | 文件数 | 体积 | 最早文件时间 | 最晚文件时间 |"
|
||||
echo "|---|---:|---:|---|---|"
|
||||
|
||||
for batch in "${batches[@]}"; do
|
||||
batch_dir="${ARCHIVE_ROOT}/${batch}"
|
||||
file_count="$(find "${batch_dir}" -type f | wc -l)"
|
||||
size="$(du -sh "${batch_dir}" | awk '{print $1}')"
|
||||
|
||||
if [[ "${file_count}" -eq 0 ]]; then
|
||||
earliest="-"
|
||||
latest="-"
|
||||
else
|
||||
read -r earliest_epoch latest_epoch < <(
|
||||
find "${batch_dir}" -type f -printf '%T@\n' | awk '
|
||||
NR == 1 { min = $1; max = $1 }
|
||||
{ if ($1 < min) min = $1; if ($1 > max) max = $1 }
|
||||
END { printf "%d %d\n", min, max }
|
||||
'
|
||||
)
|
||||
earliest="$(fmt_epoch "${earliest_epoch}")"
|
||||
latest="$(fmt_epoch "${latest_epoch}")"
|
||||
fi
|
||||
|
||||
echo "| \`${batch}\` | ${file_count} | ${size} | ${earliest} | ${latest} |"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "## 子系统明细"
|
||||
echo
|
||||
|
||||
for batch in "${batches[@]}"; do
|
||||
batch_dir="${ARCHIVE_ROOT}/${batch}"
|
||||
logs_dir="${batch_dir}/logs"
|
||||
echo "### ${batch}"
|
||||
echo
|
||||
|
||||
if [[ ! -d "${logs_dir}" ]]; then
|
||||
echo "_未发现 \`logs/\` 子目录_"
|
||||
echo
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "| 子系统目录 | 文件数 | 体积 |"
|
||||
echo "|---|---:|---:|"
|
||||
while IFS= read -r subdir; do
|
||||
sub_name="${subdir#${logs_dir}/}"
|
||||
sub_count="$(find "${subdir}" -type f | wc -l)"
|
||||
sub_size="$(du -sh "${subdir}" | awk '{print $1}')"
|
||||
echo "| \`${sub_name}\` | ${sub_count} | ${sub_size} |"
|
||||
done < <(find "${logs_dir}" -mindepth 1 -maxdepth 1 -type d | sort)
|
||||
echo
|
||||
done
|
||||
} > "${OUTPUT_FILE}"
|
||||
|
||||
echo "[update-log-archive-index] generated ${OUTPUT_FILE}"
|
||||
Reference in New Issue
Block a user