Ghost AcademySecLearn// Seguridad Informática
🌳 Linux · DevOps · Documentación · tree
Compartir Estructuras
con tree

Documenta la arquitectura de cualquier proyecto con un solo comando. Imprescindible en equipos DevOps, aulas técnicas y repositorios de onboarding.

tree -a -I ESTRUCTURA.txt alias script global find -maxdepth ~/.bashrc /usr/local/bin

¿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.

Ejemplo de salida de tree
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:

bash
which tree
Respuestas posibles
/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:

bash
sudo apt update
sudo apt install -y tree

# Verificar que se instaló correctamente
tree --version
Salida esperada
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:

bash — Comando completo recomendado
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

FlagSignificadoEfecto
-aAll filesIncluye archivos ocultos (los que empiezan por .), como .env, .gitignore, etc.
-I "patrón"IgnoreExcluye directorios que coincidan con el patrón. El separador entre patrones es |.
> ESTRUCTURA.txtRedirecciónGuarda la salida en un archivo de texto en lugar de mostrarla por pantalla.
VERIFICAR que el archivo se creó correctamente
bash
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:

.git node_modules vendor .venv venv dist build .idea .vscode .DS_Store __pycache__ coverage .next .turbo .parcel-cache
PatrónTecnologíaRazón para ignorar
.gitGitHistorial interno de Git — miles de archivos binarios irrelevantes para la estructura del proyecto.
node_modulesNode.js / npmDependencias instaladas. Pueden contener cientos de miles de archivos.
vendorPHP / GoDependencias de Composer o Go modules.
.venv / venvPythonEntorno virtual de Python con todas las librerías instaladas.
dist / buildVariosArchivos generados por el proceso de compilación o bundling.
.idea / .vscodeIDEsConfiguración local de PyCharm, IntelliJ o VSCode — no es parte del proyecto.
__pycache__PythonArchivos compilados .pyc generados automáticamente por Python.
.next / .turboNext.js / TurboCaché de build de frameworks modernos de JavaScript.

Variantes Útiles

Dependiendo de lo que quieras mostrar, puedes ajustar el comando con estas variantes:

a Solo carpetas (más compacto)
tree -d -a -I "..." > ESTRUCTURA.txt La flag -d (directories) muestra solo la estructura de carpetas, ideal para proyectos grandes.
b Limitar profundidad
tree -a -L 3 -I "..." > ESTRUCTURA.txt -L 3 limita a 3 niveles de profundidad. Útil para proyectos con estructura muy anidada.
c Guardar con fecha incluida
tree -a -I "..." > ESTRUCTURA-$(date +%F).txt Genera: ESTRUCTURA-2025-01-15.txt Útil si subes varias versiones del mismo proyecto.

Comandos completos de las variantes

bash — a) Solo carpetas
tree -d -a -I ".git|node_modules|vendor|.venv|venv|dist|build|.idea|.vscode|.DS_Store|__pycache__|coverage|.next|.turbo|.parcel-cache" > ESTRUCTURA.txt
bash — b) Limitar profundidad a 3 niveles
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
bash — c) Con fecha en el nombre del archivo
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:

bash — Añadir a ~/.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'
RECARGAR la configuración del shell
bash
# Para bash:
source ~/.bashrc

# Para zsh:
source ~/.zshrc
USAR el alias
bash — Desde cualquier proyecto
estructura
💡 Qué hace el alias completo: Ejecuta 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.

PASO 1 — Crear el script con su contenido completo

Copia y pega este bloque completo en tu terminal y presiona Enter:

bash — Crear /usr/local/bin/estructura
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
ℹ️ Contraseña sudo: La terminal pedirá tu contraseña para escribir en /usr/local/bin/, que es una carpeta protegida del sistema.
PASO 2 — Dar permisos de ejecución (¡Crucial!)
bash
sudo chmod +x /usr/local/bin/estructura
USAR el script desde cualquier proyecto
bash
cd /ruta/a/mi-proyecto
estructura
💡 Script vs Alias: El script global en /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)

bash — Versión correcta: -maxdepth PRIMERO
find . -maxdepth 4 -not -path "*/.git/*" -not -path "*/node_modules/*" > ESTRUCTURA.txt

¿Por qué importa el orden de los argumentos?

Advertencia de find al usar -maxdepth en posición incorrecta
Advertencia de find sobre el orden de 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.).

⚠️ Versión con advertencia
find . -not -path "*/.git/*"
     -not -path "*/node_modules/*"
     -maxdepth 4
     > ESTRUCTURA.txt
✓ Versión correcta
find . -maxdepth 4
     -not -path "*/.git/*"
     -not -path "*/node_modules/*"
     > ESTRUCTURA.txt
⚠️ Regla de find: Las opciones globales como -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

ErrorCausaSolució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 ...