¿Por qué usar tree?
Cuando trabajamos en proyectos colaborativos, una de las tareas más básicas —y a la vez más olvidadas— es documentar la estructura de carpetas y archivos.
En equipos DevOps, aulas técnicas o repositorios de onboarding, poder mostrar la arquitectura de un proyecto con un solo comando mejora la productividad, la comunicación y el mantenimiento.
mi-proyecto/ ├── src/ │ ├── components/ │ │ ├── Header.jsx │ │ └── Footer.jsx │ ├── utils/ │ │ └── helpers.js │ └── index.js ├── public/ │ └── favicon.ico ├── package.json └── README.md 4 directories, 7 files
Verificar si tree Está Instalado
Antes de instalar nada, comprueba si ya lo tienes en tu sistema:
which tree
/usr/bin/tree ← Ya instalado ✓
← Sin salida = no instalado, continúa al siguiente paso
Instalar tree
El comando tree no siempre viene por defecto en Ubuntu. La instalación es sencilla:
sudo apt update
sudo apt install -y tree
# Verificar que se instaló correctamente
tree --version
tree v2.1.1 (c) 1996 - 2023 by Steve Baker, Thomas Moore, Francesc Rocher, Kyosuke Tokoro
Generar la Estructura del Proyecto
Desde la raíz de tu proyecto, genera el archivo con la estructura completa de carpetas y ficheros:
tree -a -I ".git|node_modules|vendor|.venv|venv|dist|build|.idea|.vscode|.DS_Store|__pycache__|coverage|.next|.turbo|.parcel-cache" > ESTRUCTURA.txt
Opciones del comando
| Flag | Significado | Efecto |
|---|---|---|
| -a | All files | Incluye archivos ocultos (los que empiezan por .), como .env, .gitignore, etc. |
| -I "patrón" | Ignore | Excluye directorios que coincidan con el patrón. El separador entre patrones es |. |
| > ESTRUCTURA.txt | Redirección | Guarda la salida en un archivo de texto en lugar de mostrarla por pantalla. |
ls -lh ESTRUCTURA.txt # Tamaño y fecha del archivo head -n 40 ESTRUCTURA.txt # Primeras 40 líneas del contenido
Patrones Ignorados por Defecto
El patrón -I del comando principal excluye directorios "ruidosos" que no aportan nada a la documentación y solo aumentan el ruido:
| Patrón | Tecnología | Razón para ignorar |
|---|---|---|
| .git | Git | Historial interno de Git — miles de archivos binarios irrelevantes para la estructura del proyecto. |
| node_modules | Node.js / npm | Dependencias instaladas. Pueden contener cientos de miles de archivos. |
| vendor | PHP / Go | Dependencias de Composer o Go modules. |
| .venv / venv | Python | Entorno virtual de Python con todas las librerías instaladas. |
| dist / build | Varios | Archivos generados por el proceso de compilación o bundling. |
| .idea / .vscode | IDEs | Configuración local de PyCharm, IntelliJ o VSCode — no es parte del proyecto. |
| __pycache__ | Python | Archivos compilados .pyc generados automáticamente por Python. |
| .next / .turbo | Next.js / Turbo | Caché de build de frameworks modernos de JavaScript. |
Variantes Útiles
Dependiendo de lo que quieras mostrar, puedes ajustar el comando con estas variantes:
Comandos completos de las variantes
tree -d -a -I ".git|node_modules|vendor|.venv|venv|dist|build|.idea|.vscode|.DS_Store|__pycache__|coverage|.next|.turbo|.parcel-cache" > ESTRUCTURA.txt
tree -a -L 3 -I ".git|node_modules|vendor|.venv|venv|dist|build|.idea|.vscode|.DS_Store|__pycache__|coverage|.next|.turbo|.parcel-cache" > ESTRUCTURA.txt
tree -a -I ".git|node_modules|vendor|.venv|venv|dist|build|.idea|.vscode|.DS_Store|__pycache__|coverage|.next|.turbo|.parcel-cache" > ESTRUCTURA-$(date +%F).txt
Alias Rápido (bash o zsh)
Si usas este comando a menudo, crea un alias para no escribirlo completo cada vez. Añade esta línea al final de tu ~/.bashrc o ~/.zshrc:
alias estructura='tree -a -I ".git|node_modules|vendor|.venv|venv|dist|build|.idea|.vscode|.DS_Store|__pycache__|coverage|.next|.turbo|.parcel-cache" > ESTRUCTURA.txt && ls -lh ESTRUCTURA.txt && head -n 40 ESTRUCTURA.txt'
# Para bash: source ~/.bashrc # Para zsh: source ~/.zshrc
estructura
tree con todos los filtros → guarda en ESTRUCTURA.txt → muestra el tamaño del archivo con ls -lh → imprime las primeras 40 líneas con head. Todo en un solo comando.Script Global (Accesible en Todo el Sistema)
Si quieres que tu equipo tenga un comando único y accesible desde cualquier directorio, crea un script en /usr/local/bin/. Así funcionará igual que cualquier otro comando de Linux.
Copia y pega este bloque completo en tu terminal y presiona Enter:
sudo tee /usr/local/bin/estructura >/dev/null <<'SH'
#!/usr/bin/env bash
set -euo pipefail
OUT="ESTRUCTURA.txt"
IGNORE=".git|node_modules|vendor|.venv|venv|dist|build|.idea|.vscode|.DS_Store|__pycache__|coverage|.next|.turbo|.parcel-cache"
tree -a -I "$IGNORE" > "$OUT"
ls -lh "$OUT"
head -n 40 "$OUT"
SH
/usr/local/bin/, que es una carpeta protegida del sistema.sudo chmod +x /usr/local/bin/estructura
cd /ruta/a/mi-proyecto estructura
/usr/local/bin/ está disponible para todos los usuarios del sistema y funciona en cualquier shell (bash, zsh, fish…). El alias solo funciona en el usuario y shell donde lo definas.Plan B — find sin tree
Si no puedes instalar tree (entorno restringido, servidor sin acceso a internet…), puedes usar find como alternativa. No es tan visual, pero cumple la misma función.
Sintaxis correcta (recomendada)
find . -maxdepth 4 -not -path "*/.git/*" -not -path "*/node_modules/*" > ESTRUCTURA.txt
¿Por qué importa el orden de los argumentos?
Esta advertencia no es un error que impida la ejecución, sino un aviso sobre mala práctica: -maxdepth es una opción global de find y debe colocarse antes de cualquier prueba (-not -path, -name, etc.).
find . -not -path "*/.git/*"
-not -path "*/node_modules/*"
-maxdepth 4
> ESTRUCTURA.txt
find . -maxdepth 4
-not -path "*/.git/*"
-not -path "*/node_modules/*"
> ESTRUCTURA.txt
-maxdepth, -mindepth o -L deben ir siempre justo después del directorio de inicio (.), antes de cualquier prueba o acción. Al moverlo al inicio evitas la advertencia y garantizas que la restricción de profundidad se aplica desde el principio de la lógica de búsqueda.Problemas Comunes
| Error | Causa | Solución |
|---|---|---|
| tree: command not found | tree no está instalado en el sistema | Instalar: sudo apt install -y tree |
| Alias no funciona | El alias se añadió pero el shell no ha recargado la configuración | Recargar: source ~/.bashrc o source ~/.zshrc |
| Permission denied en /usr/local/bin | Se intentó escribir en una carpeta del sistema sin privilegios | Usar sudo: sudo tee /usr/local/bin/estructura |
| ESTRUCTURA.txt vacío | El comando se ejecutó desde un directorio incorrecto | Verificar ubicación con pwd y contenido con ls -la, luego ejecutar desde la raíz del proyecto |
| find: warning sobre -maxdepth | -maxdepth está colocado después de una prueba, no al principio |
Mover -maxdepth N justo después del directorio: find . -maxdepth 4 -not -path ... |