Last active 1 week ago

Top 20 tags de tu vault de notas Markdown — fd + yq + jq (episodio 838)

tags-report.sh Raw
1#!/usr/bin/env bash
2# ==============================================================
3# tags-report.sh — Top 20 tags de tu vault de notas
4#
5# Extrae el frontmatter de todas las notas Markdown, recopila
6# los tags, los cuenta y muestra un ranking ordenado por
7# frecuencia de uso.
8#
9# Uso: ./tags-report.sh [ruta-al-vault]
10# Si no se especifica ruta, usa el directorio actual.
11#
12# Dependencias: fd, yq (Mike Farah), jq
13#
14# Ejemplo: ./tags-report.sh ~/notas
15# ==============================================================
16
17VAULT="${1:-.}"
18
19# ─── Cabecera ────────────────────────────────────────────────────
20echo "=========================================="
21echo " Tags Report — $(date +'%d/%m/%Y')"
22echo " Vault: $VAULT"
23echo "=========================================="
24echo ""
25
26# ─── Verificar herramientas ──────────────────────────────────────
27for cmd in fd yq jq; do
28 if ! command -v "$cmd" &>/dev/null; then
29 echo "[ERROR] '$cmd' no está instalado."
30 echo " Instálalo con:"
31 echo " - fd: sudo apt install fd-find"
32 echo " - yq: sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq"
33 echo " - jq: sudo apt install jq"
34 exit 1
35 fi
36done
37
38# ─── Pipeline principal ──────────────────────────────────────────
39REPORT=$(fd -e md "$VAULT" -x yq --front-matter=extract -o=json '.tags // []' 2>/dev/null \
40 | jq -s '
41 add
42 | group_by(.)
43 | map({tag: .[0], count: length})
44 | sort_by(-.count)
45 | .[:20][]
46 | "\(.count) \(.tag)"
47 ' -r
48)
49if [[ -n "$REPORT" ]]; then
50 echo "$REPORT"
51else
52 echo " ⚠️ salida vacía: revisa que yq emita JSON (-o=json) antes de jq"
53fi
54
55# ─── Resumen ─────────────────────────────────────────────────────
56echo ""
57TOTAL_NOTAS=$(find "$VAULT" -name '*.md' | wc -l)
58echo " Notas analizadas: $TOTAL_NOTAS"
59echo ""
60
61# ==============================================================
62# Notas:
63#
64# 1. '// []' es el operador default de yq: si '.tags' no existe
65# o es null, devuelve un array vacío en lugar de null.
66#
67# 2. '2>/dev/null' descarta errores de archivos sin frontmatter
68# o que no son YAML válido.
69#
70# 3. '.[:20]' limita el resultado a los 20 tags más usados.
71#
72# 4. La flag '-r' de jq produce raw output (sin comillas en
73# los strings), ideal para formatear la salida.
74# ==============================================================