tags-report.sh
· 2.8 KiB · Bash
原始文件
#!/usr/bin/env bash
# ==============================================================
# tags-report.sh — Top 20 tags de tu vault de notas
#
# Extrae el frontmatter de todas las notas Markdown, recopila
# los tags, los cuenta y muestra un ranking ordenado por
# frecuencia de uso.
#
# Uso: ./tags-report.sh [ruta-al-vault]
# Si no se especifica ruta, usa el directorio actual.
#
# Dependencias: fd, yq (Mike Farah), jq
#
# Ejemplo: ./tags-report.sh ~/notas
# ==============================================================
VAULT="${1:-.}"
# ─── Cabecera ────────────────────────────────────────────────────
echo "=========================================="
echo " Tags Report — $(date +'%d/%m/%Y')"
echo " Vault: $VAULT"
echo "=========================================="
echo ""
# ─── Verificar herramientas ──────────────────────────────────────
for cmd in fd yq jq; do
if ! command -v "$cmd" &>/dev/null; then
echo "[ERROR] '$cmd' no está instalado."
echo " Instálalo con:"
echo " - fd: sudo apt install fd-find"
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"
echo " - jq: sudo apt install jq"
exit 1
fi
done
# ─── Pipeline principal ──────────────────────────────────────────
REPORT=$(fd -e md "$VAULT" -x yq --front-matter=extract -o=json '.tags // []' 2>/dev/null \
| jq -s '
add
| group_by(.)
| map({tag: .[0], count: length})
| sort_by(-.count)
| .[:20][]
| "\(.count) \(.tag)"
' -r
)
if [[ -n "$REPORT" ]]; then
echo "$REPORT"
else
echo " ⚠️ salida vacía: revisa que yq emita JSON (-o=json) antes de jq"
fi
# ─── Resumen ─────────────────────────────────────────────────────
echo ""
TOTAL_NOTAS=$(find "$VAULT" -name '*.md' | wc -l)
echo " Notas analizadas: $TOTAL_NOTAS"
echo ""
# ==============================================================
# Notas:
#
# 1. '// []' es el operador default de yq: si '.tags' no existe
# o es null, devuelve un array vacío en lugar de null.
#
# 2. '2>/dev/null' descarta errores de archivos sin frontmatter
# o que no son YAML válido.
#
# 3. '.[:20]' limita el resultado a los 20 tags más usados.
#
# 4. La flag '-r' de jq produce raw output (sin comillas en
# los strings), ideal para formatear la salida.
# ==============================================================
| 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 | |
| 17 | VAULT="${1:-.}" |
| 18 | |
| 19 | # ─── Cabecera ──────────────────────────────────────────────────── |
| 20 | echo "==========================================" |
| 21 | echo " Tags Report — $(date +'%d/%m/%Y')" |
| 22 | echo " Vault: $VAULT" |
| 23 | echo "==========================================" |
| 24 | echo "" |
| 25 | |
| 26 | # ─── Verificar herramientas ────────────────────────────────────── |
| 27 | for 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 |
| 36 | done |
| 37 | |
| 38 | # ─── Pipeline principal ────────────────────────────────────────── |
| 39 | REPORT=$(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 | ) |
| 49 | if [[ -n "$REPORT" ]]; then |
| 50 | echo "$REPORT" |
| 51 | else |
| 52 | echo " ⚠️ salida vacía: revisa que yq emita JSON (-o=json) antes de jq" |
| 53 | fi |
| 54 | |
| 55 | # ─── Resumen ───────────────────────────────────────────────────── |
| 56 | echo "" |
| 57 | TOTAL_NOTAS=$(find "$VAULT" -name '*.md' | wc -l) |
| 58 | echo " Notas analizadas: $TOTAL_NOTAS" |
| 59 | echo "" |
| 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 | # ============================================================== |