#!/bin/bash

sudo apt install -y pv        # Ubuntu/Debian. RHEL 계열은 dnf install pv, macOS 는 brew install pv

sudo bash -c '
ROOT=${1:-/var/log/nginx}
mapfile -t FILES < <(find "$ROOT" -name "*.gz" -type f | sort)
TOTAL=${#FILES[@]}; [ "$TOTAL" -eq 0 ] && { echo "no .gz under $ROOT"; exit 0; }
command -v pv >/dev/null && HAVE_PV=1 || HAVE_PV=0
START=$(date +%s); DONE=0; FAIL=0
for f in "${FILES[@]}"; do
  DONE=$((DONE+1)); PCT=$((DONE*100/TOTAL)); ELAPSED=$(( $(date +%s) - START ))
  BAR=$(printf "%-30s" "$(printf "#%.0s" $(seq 1 $((PCT*30/100))))")
  [ "$DONE" -gt 1 ] && printf "\033[2A"            # 이전 두 줄 위로 올라가 덮어쓰기
  printf "\r\033[K[%s] %3d%% %d/%d  %4ds  fail=%d  %s\n" "$BAR" "$PCT" "$DONE" "$TOTAL" "$ELAPSED" "$FAIL" "${f##*/}"
  printf "\033[K"
  if [ "$HAVE_PV" = 1 ]; then
    SIZE=$(gzip -l "$f" 2>/dev/null | awk "NR==2{print \$2}")   # 압축 해제 크기 (ETA 계산용)
    FILTER=(pv -s "${SIZE:-0}" -N "${f##*/}" -pterb -w 100)
  else
    FILTER=(cat)
  fi
  if gunzip -c "$f" | "${FILTER[@]}" | xz -T2 -6 > "${f%.gz}.xz.part" \
     && mv "${f%.gz}.xz.part" "${f%.gz}.xz" && touch -r "$f" "${f%.gz}.xz" && rm "$f"; then
    [ "$HAVE_PV" = 0 ] && echo
  else
    FAIL=$((FAIL+1)); rm -f "${f%.gz}.xz.part"; printf "  FAIL: %s\n\n\n" "$f"
  fi
done
printf "\ndone: %d/%d converted, %d failed, %ds\n" "$((DONE-FAIL))" "$TOTAL" "$FAIL" "$(( $(date +%s) - START ))"
' _ /var/log/nginx
