328 líneas
7.6 KiB
Markdown
328 líneas
7.6 KiB
Markdown
# topdir.sh
|
|
|
|
Script en bash que compara recursivamente un directorio y genera informes de archivos nuevos, modificados y eliminados desde la última ejecución.
|
|
|
|
## Características
|
|
|
|
- 🔍 **Detección de cambios**: Identifica archivos nuevos, modificados y eliminados
|
|
- 🔐 **Múltiples algoritmos de hash**: SHA256 (default), SHA1, MD5
|
|
- 📊 **Formatos de salida**: Text (humano), JSON (programático), CSV (hoja de cálculo)
|
|
- 🚫 **Sistema de exclusiones**: Excluye archivos/directorios por patrón o archivo `.topdirignore`
|
|
- 💾 **Snapshot personalizable**: Ubicación configurable del archivo de estado
|
|
- ⚡ **Portable**: Bash estándar con utilidades comunes (find, sed, awk)
|
|
|
|
## Instalación
|
|
|
|
```bash
|
|
chmod +x topdir.sh
|
|
# Opcionalmente, mover a un directorio en tu PATH
|
|
sudo cp topdir.sh /usr/local/bin/topdir
|
|
```
|
|
|
|
## Uso básico
|
|
|
|
```bash
|
|
# Monitorear directorio actual
|
|
./topdir.sh
|
|
|
|
# Monitorear directorio específico
|
|
./topdir.sh /path/to/directory
|
|
|
|
# Ver ayuda completa
|
|
./topdir.sh --help
|
|
```
|
|
|
|
### Primera ejecución
|
|
La primera vez que ejecutas el script en un directorio, crea un archivo `.topdir_snapshot` con el estado inicial:
|
|
|
|
```bash
|
|
$ ./topdir.sh /data
|
|
Snapshot creado en './.topdir_snapshot' (no había ejecución previa).
|
|
```
|
|
|
|
### Ejecuciones posteriores
|
|
Las siguientes ejecuciones comparan contra el snapshot y muestran cambios:
|
|
|
|
```bash
|
|
$ ./topdir.sh /data
|
|
Informe de comparación para: /data
|
|
|
|
Nuevos archivos (2):
|
|
./report.pdf
|
|
./images/photo.jpg
|
|
|
|
Archivos modificados (1):
|
|
./config.txt
|
|
|
|
Archivos eliminados desde último snapshot (1):
|
|
./temp.log
|
|
```
|
|
|
|
## Opciones avanzadas
|
|
|
|
### Algoritmos de hash
|
|
|
|
Elige entre SHA256 (default), SHA1 o MD5:
|
|
|
|
```bash
|
|
# Usar MD5 (más rápido para archivos grandes)
|
|
./topdir.sh --hash md5 /data
|
|
|
|
# Usar SHA1
|
|
./topdir.sh --hash sha1 /data
|
|
```
|
|
|
|
### Formatos de salida
|
|
|
|
#### Formato Text (default)
|
|
Salida legible para humanos:
|
|
|
|
```bash
|
|
./topdir.sh /data
|
|
```
|
|
|
|
#### Formato JSON
|
|
Para procesamiento programático:
|
|
|
|
```bash
|
|
./topdir.sh --format json /data
|
|
```
|
|
|
|
Salida:
|
|
```json
|
|
{
|
|
"status": "ok",
|
|
"directory": "/data",
|
|
"hash": "sha256",
|
|
"new": ["./file1.txt", "./file2.txt"],
|
|
"modified": ["./config.json"],
|
|
"deleted": ["./old.log"]
|
|
}
|
|
```
|
|
|
|
#### Formato CSV
|
|
Para análisis en hojas de cálculo:
|
|
|
|
```bash
|
|
./topdir.sh --format csv /data
|
|
```
|
|
|
|
Salida:
|
|
```csv
|
|
status,path
|
|
new,"./file1.txt"
|
|
new,"./file2.txt"
|
|
modified,"./config.json"
|
|
deleted,"./old.log"
|
|
```
|
|
|
|
### Exclusiones de archivos
|
|
|
|
#### Opción --exclude
|
|
|
|
Excluye patrones específicos (puede repetirse):
|
|
|
|
```bash
|
|
# Excluir extensiones
|
|
./topdir.sh --exclude "*.log" --exclude "*.tmp" /data
|
|
|
|
# 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
|
|
*.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
|
|
./topdir.sh /project
|
|
# Lee automáticamente .topdirignore
|
|
```
|
|
|
|
#### Archivo de exclusión personalizado
|
|
|
|
```bash
|
|
./topdir.sh --ignore-file /path/to/custom.ignore /data
|
|
```
|
|
|
|
### Snapshot personalizado
|
|
|
|
Por defecto, el snapshot se guarda como `.topdir_snapshot` dentro del directorio monitoreado. Puedes especificar una ubicación diferente:
|
|
|
|
```bash
|
|
# Snapshot en /tmp
|
|
./topdir.sh --snapshot-file /tmp/data.snapshot /data
|
|
|
|
# Snapshot en directorio home
|
|
./topdir.sh --snapshot-file ~/snapshots/project.snap /project
|
|
```
|
|
|
|
Útil para:
|
|
- Monitorear directorios de solo lectura
|
|
- Mantener múltiples snapshots del mismo directorio
|
|
- Guardar snapshots en almacenamiento centralizado
|
|
|
|
## Ejemplos completos
|
|
|
|
### Monitoreo de proyecto de desarrollo
|
|
|
|
```bash
|
|
# Primera ejecución - crear snapshot con MD5 y excluir archivos de build
|
|
./topdir.sh --hash md5 \
|
|
--exclude "node_modules/*" \
|
|
--exclude "dist/*" \
|
|
--exclude "*.log" \
|
|
/home/user/myproject
|
|
|
|
# Después de trabajar, verificar cambios en JSON
|
|
./topdir.sh --hash md5 \
|
|
--format json \
|
|
--exclude "node_modules/*" \
|
|
--exclude "dist/*" \
|
|
--exclude "*.log" \
|
|
/home/user/myproject | jq .
|
|
```
|
|
|
|
### Monitoreo de directorio de datos
|
|
|
|
```bash
|
|
# Snapshot en ubicación centralizada, salida CSV
|
|
./topdir.sh --snapshot-file /var/snapshots/data.snap \
|
|
--format csv \
|
|
--exclude "*.tmp" \
|
|
/data > changes.csv
|
|
```
|
|
|
|
### Integración con cron
|
|
|
|
```bash
|
|
# Agregar a crontab para chequeo diario
|
|
# 0 3 * * * /usr/local/bin/topdir --format json --snapshot-file /var/snapshots/backup.snap /backup > /var/log/topdir.json 2>&1
|
|
```
|
|
|
|
### Comparar con snapshot anterior sin actualizar
|
|
|
|
Si quieres ver cambios sin actualizar el snapshot:
|
|
|
|
```bash
|
|
# Hacer backup del snapshot
|
|
cp /data/.topdir_snapshot /tmp/snapshot.bak
|
|
|
|
# Ejecutar topdir (actualiza el snapshot)
|
|
./topdir.sh /data
|
|
|
|
# Restaurar snapshot original
|
|
mv /tmp/snapshot.bak /data/.topdir_snapshot
|
|
```
|
|
|
|
## Notas técnicas
|
|
|
|
### Rendimiento
|
|
|
|
- **SHA256**: Más seguro, recomendado para verificación de integridad (default)
|
|
- **SHA1**: Balance entre velocidad y seguridad
|
|
- **MD5**: Más rápido, adecuado para detección de cambios en archivos grandes (no para seguridad)
|
|
|
|
### Limitaciones
|
|
|
|
- Los archivos con nombres que contienen saltos de línea pueden no procesarse correctamente
|
|
- El script no sigue enlaces simbólicos (por diseño)
|
|
- Requiere bash >= 3.2 y utilidades estándar (find, sed, awk, sha256sum/sha1sum/md5sum)
|
|
|
|
### Archivos excluidos automáticamente
|
|
|
|
El script siempre excluye:
|
|
- `.topdir_snapshot` (archivo de estado)
|
|
- `.topdirignore` (archivo de configuración de exclusiones)
|
|
|
|
### Formato del snapshot
|
|
|
|
El snapshot es un archivo de texto con formato:
|
|
```
|
|
<path><TAB><hash>
|
|
```
|
|
|
|
Ejemplo:
|
|
```
|
|
./file1.txt e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
|
./file2.txt d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
|
|
```
|
|
|
|
## Solución de problemas
|
|
|
|
### "Command not found: sha256sum"
|
|
|
|
En macOS, instala `coreutils`:
|
|
```bash
|
|
brew install coreutils
|
|
```
|
|
|
|
O usa SHA1/MD5 que vienen preinstalados:
|
|
```bash
|
|
./topdir.sh --hash sha1 /data
|
|
```
|
|
|
|
### "Snapshot file not found" en ejecuciones posteriores
|
|
|
|
Asegúrate de usar la misma opción `--snapshot-file` en todas las ejecuciones:
|
|
```bash
|
|
# Primera ejecución
|
|
./topdir.sh --snapshot-file /tmp/my.snap /data
|
|
|
|
# Ejecuciones posteriores - debe usar el mismo snapshot
|
|
./topdir.sh --snapshot-file /tmp/my.snap /data
|
|
```
|
|
|
|
### Archivos no se detectan como modificados
|
|
|
|
- Verifica que no estén excluidos por `.topdirignore` o `--exclude`
|
|
- Confirma que el contenido cambió (el script usa hash, no mtime)
|
|
- Verifica que usas el mismo algoritmo de hash (`--hash`)
|
|
|
|
## Licencia
|
|
|
|
Dominio público / MIT - Usa como quieras.
|
|
|
|
## Autor
|
|
|
|
Creado para monitoreo sencillo de cambios en directorios sin dependencias pesadas.
|