From b12c3ebfa19c6f0befd21d9e2a76fcc7f4eefe71 Mon Sep 17 00:00:00 2001 From: ale Date: Sat, 1 Nov 2025 17:35:58 +0100 Subject: [PATCH] fix .topdirignore Signed-off-by: ale --- .topdirignore.example | 31 +++++++++++++++++++------------ README.md | 37 ++++++++++++++++++++++++++++++++----- topdir.sh | 20 +++++++++++++++++++- 3 files changed, 70 insertions(+), 18 deletions(-) diff --git a/.topdirignore.example b/.topdirignore.example index 303aafa..1686c76 100644 --- a/.topdirignore.example +++ b/.topdirignore.example @@ -2,6 +2,13 @@ # Archivo de exclusiones para topdir.sh # Sintaxis similar a .gitignore +# IMPORTANTE: Para excluir carpetas, simplemente pon el nombre +# El script automáticamente excluye recursivamente (añade /*) +# Estos tres formatos son equivalentes: +# logs +# logs/ +# logs/* + # Logs y temporales *.log *.tmp @@ -9,16 +16,16 @@ *.swp *.bak -# Directorios de build -dist/* -build/* -out/* -target/* +# Directorios de build (excluye recursivamente) +dist +build +out +target -# Dependencias -node_modules/* -vendor/* -__pycache__/* +# Dependencias (excluye recursivamente) +node_modules +vendor +__pycache__ # Archivos compilados *.pyc @@ -28,8 +35,8 @@ __pycache__/* *.class # IDEs -.vscode/* -.idea/* +.vscode +.idea *.sublime-* # Sistema operativo @@ -38,5 +45,5 @@ Thumbs.db desktop.ini # Git -.git/* +.git .gitignore diff --git a/README.md b/README.md index e954368..08b0c9d 100644 --- a/README.md +++ b/README.md @@ -123,27 +123,54 @@ deleted,"./old.log" Excluye patrones específicos (puede repetirse): ```bash -# Excluir logs y temporales +# Excluir extensiones ./topdir.sh --exclude "*.log" --exclude "*.tmp" /data -# Excluir directorios completos +# Excluir carpetas completas (recursivamente) +./topdir.sh --exclude "node_modules" --exclude "logs" /project +# O con formato explícito: ./topdir.sh --exclude "node_modules/*" --exclude ".git/*" /project + +# Excluir subdirectorios específicos +./topdir.sh --exclude "src/test/*" --exclude "docs/drafts" /project ``` +**Tip**: Si el patrón es solo un nombre de carpeta (sin `*` ni `/` al final), el script verifica si existe como directorio y automáticamente añade `/*` para exclusión recursiva. + #### Archivo .topdirignore Crea un archivo `.topdirignore` en el directorio monitoreado con patrones (similar a `.gitignore`): ```bash # .topdirignore + +# Extensiones - excluye archivos con estas extensiones en cualquier ubicación *.log *.tmp -node_modules/* -.git/* -__pycache__/* *.pyc + +# Carpetas - excluye recursivamente (automático) +node_modules +.git +__pycache__ +cache +logs +build + +# También puedes usar estos formatos (equivalentes): +node_modules/ +node_modules/* + +# Patrones específicos +temp/* +dist/*.js ``` +**Importante**: Para excluir carpetas, simplemente pon el nombre de la carpeta. El script automáticamente lo convierte a exclusión recursiva (añade `/*`). Los siguientes formatos son equivalentes: +- `logs` → excluye `logs/*` (todo dentro de logs/) +- `logs/` → excluye `logs/*` +- `logs/*` → excluye `logs/*` + Luego ejecuta normalmente: ```bash diff --git a/topdir.sh b/topdir.sh index 47204ba..d3ec2fd 100755 --- a/topdir.sh +++ b/topdir.sh @@ -148,8 +148,26 @@ fi find_cmd=(find . -type f ! -name '.topdir_snapshot' ! -name '.topdirignore') for pattern in "${EXCLUDE_PATTERNS[@]}"; do + # Normalizar el patrón: + # Si el patrón no contiene /* ni * al final, y es un directorio, añadir /* + # Esto permite que "logs" se convierta en "logs/*" automáticamente + normalized_pattern="$pattern" + + # Si el patrón no tiene wildcards ni slash al final + if [[ "$pattern" != *\** && "$pattern" != */ ]]; then + # Si existe como directorio, añadir /* para exclusión recursiva + if [[ -d "./$pattern" ]]; then + normalized_pattern="$pattern/*" + fi + fi + + # Remover / final si existe (para que "logs/" -> "logs/*") + if [[ "$normalized_pattern" == */ && "$normalized_pattern" != *\* ]]; then + normalized_pattern="${normalized_pattern}*" + fi + # Convertir pattern a formato find -path - find_cmd+=(! -path "./$pattern") + find_cmd+=(! -path "./$normalized_pattern") done # Generar nuevo snapshot: compute hash para cada archivo regular