back to scripts

nas-junk-cleanup.sh

bash 74 lines secrets redacted

Clears junk / temp / leftover files to reclaim space.

Note Live script from my home-lab server. Tokens, IDs, phone numbers and other secrets have been replaced with placeholders like <WHATSAPP_GROUP_ID> — everything else is the real, running code.
#!/usr/bin/env bash
set -u
MODE="${1:---dry-run}"
if [ "$MODE" != "--dry-run" ] && [ "$MODE" != "--apply" ]; then
  echo "Usage: $0 [--dry-run|--apply]" >&2
  exit 2
fi
REPORT_DIR=/home/lanky/reports
mkdir -p "$REPORT_DIR"
STAMP=$(date +%Y%m%d-%H%M%S)
OUT="$REPORT_DIR/nas-junk-cleanup-$STAMP.txt"
LATEST="$REPORT_DIR/nas-junk-cleanup-latest.txt"
MIN_AGE_DAYS=7
{
  echo "NAS Junk Cleanup"
  echo "Generated: $(date -Is)"
  echo "Mode: $MODE"
  echo "Policy: delete only obvious download residue from /mnt/nas older than ${MIN_AGE_DAYS} days; report-only for /mnt/jelly"
  echo

  for m in /mnt/nas /mnt/jelly; do
    if ! mountpoint -q "$m"; then
      echo "BAD: $m is not mounted; refusing to continue"
      exit 1
    fi
    if ! timeout 10s ls -ld "$m" >/dev/null 2>&1; then
      echo "BAD: $m is not responding; refusing to continue"
      exit 1
    fi
  done

  echo "== /mnt/nas deletable junk candidates =="
  tmpfile=$(mktemp)
  trap 'rm -f "$tmpfile"' EXIT
  timeout 20m find /mnt/nas -xdev -type f -mtime +"$MIN_AGE_DAYS" \
    \( -iname '*.part' -o -iname '*.partial' -o -iname '*.tmp' -o -iname '*.!qB' -o -iname '*.aria2' -o -iname '*.unwanted' -o -iname '*.bad' -o -iname '*.failed' -o -iname 'Thumbs.db' -o -iname '.DS_Store' -o -ipath '*/sample/*' -o -iname '*sample*.avi' -o -iname '*sample*.mkv' -o -iname '*sample*.mp4' \) \
    -printf '%s\t%p\n' 2>/dev/null | sort -nr > "$tmpfile"
  cat "$tmpfile"
  count=$(wc -l < "$tmpfile")
  bytes=$(awk '{s+=$1} END {printf "%.0f", s+0}' "$tmpfile")
  echo
  echo "Candidates: $count"
  echo "Bytes: $bytes"
  awk -v b="$bytes" 'BEGIN {printf "GiB: %.2f\n", b/1024/1024/1024}'

  if [ "$MODE" = "--apply" ] && [ "$count" -gt 0 ]; then
    echo
    echo "== deleting =="
    cut -f2- "$tmpfile" | while IFS= read -r path; do
      case "$path" in
        /mnt/nas/*)
          echo "DELETE: $path"
          /home/lanky/scripts/safe-recycle.py \
            "definite download junk older than ${MIN_AGE_DAYS} days" \
            "$path" || echo "ERROR recycling: $path"
          ;;
        *)
          echo "SKIP outside /mnt/nas: $path"
          ;;
      esac
    done
  fi

  echo
  echo "== /mnt/jelly suspicious junk report only =="
  timeout 10m find /mnt/jelly -xdev -type f \
    \( -iname '*.part' -o -iname '*.partial' -o -iname '*.tmp' -o -iname '*.!qB' -o -iname '*.aria2' -o -iname '*.unwanted' -o -iname 'Thumbs.db' -o -iname '.DS_Store' -o -ipath '*/sample/*' \) \
    -printf '%s\t%p\n' 2>/dev/null | sort -nr | head -500 || echo "WARN: /mnt/jelly report timed out or failed"
} > "$OUT" 2>&1
status=$?
chmod 0644 "$OUT"
cp "$OUT" "$LATEST"
echo "$OUT"
exit $status

back to scripts