Módulo 1: La terminal y el sistema de archivos

7. Navegar e inspeccionar: pwd, ls y cd

Descripción

Al terminar esta lección vas a poder confirmar en cualquier momento en qué directorio estás parado con pwd, leer una línea completa de ls -l columna por columna sin adivinar ningún campo, filtrar y ordenar esa salida con -a, -h, -t, -S y -R según lo que necesites ver, moverte por el árbol completo con cd usando rutas absolutas, relativas, ~ y -, ver la estructura entera de una carpeta de un vistazo con tree, y diagnosticar con precisión los tres mensajes de error que más tiempo le hacen perder a quien recién empieza.

Esto no es ceremonia. Heredas la laptop de alguien que dejó la empresa, o te conectas por SSH a un servidor que nunca viste, y la primera pregunta real no es "¿qué comando corro?" — es "¿dónde estoy parado y qué hay a mi alrededor?". Un desarrollador con experiencia no memoriza la estructura de cada proyecto nuevo: la reconstruye en segundos con pwd, ls y cd, antes de tocar una sola línea de código. Sin ese hábito, cada carpeta desconocida se siente como entrar a un cuarto a oscuras.

Conexión con el módulo: la lección anterior te dio el mapa —un único árbol que nace en /, rutas absolutas y relativas, los atajos ., .., ~ y -—. Hoy tienes los tres comandos que usan ese mapa cientos de veces al día: pwd te dice dónde estás, ls te muestra qué hay, cd te mueve. La siguiente lección no enseña nada nuevo: te da doce preguntas reales sobre tu propia máquina que solo puedes responder con exactamente estos tres comandos.


pwd: la pregunta que respondes antes de actuar

Antes de caminar en cualquier dirección dentro de un centro comercial que no conoces, miras el mapa en la pared y buscas el punto que dice "estás aquí". Sin ese punto, cualquier ruta que elijas es una apuesta. En la terminal pasa exactamente lo mismo: antes de borrar algo, mover algo o correr un script que "debería" estar ahí, confirmas dónde estás parado. pwd (print working directory) responde esa única pregunta, sin adornos.

Ya viste en la lección 2 que el prompt normalmente muestra "dónde estás parado" como parte de su información. Pero el prompt es configurable: muchas configuraciones lo acortan, muestran solo el último tramo de la ruta, o directamente lo omiten para ganar espacio. pwd no depende de ninguna configuración — siempre te da la ruta absoluta completa, sin abreviar, tal como la entiende el sistema en este momento. Cuando algo no cuadra, pwd es la fuente de verdad, no el prompt.

Ejemplo trabajado

pwd

Qué esperar (tu ruta real depende de tu usuario y de dónde estés parado; la forma es lo que importa):

/Users/alex

Sin argumentos, sin opciones, sin ambigüedad: esa es la ruta absoluta de tu directorio actual en este instante. Vas a escribir pwd decenas de veces por sesión, casi siempre antes de un comando que modifica algo — es el hábito que separa a quien actúa con certeza de quien actúa a ciegas y confía en la suerte.


ls -l: la misma etiqueta, siete campos, en cada línea

Piensa en una encomienda que llega a tu puerta. Sin importar qué haya adentro de la caja —un libro, ropa, una pieza de repuesto— la etiqueta pegada afuera siempre trae los mismos campos, en el mismo orden: quién la envía, cuánto pesa, cuándo se despachó, a nombre de quién viene. ls -l (long format) imprime exactamente esa clase de etiqueta, una por línea, para cada archivo o carpeta: siete campos fijos, siempre en el mismo orden, sin importar si lo que describen es un archivo de texto de una línea o una carpeta con miles de archivos adentro.

Vas a construir una carpeta de práctica para leer esa etiqueta con calma. mkdir ya lo usaste en la lección 4 para crear una carpeta; touch es nuevo, y hace algo igual de simple: crea un archivo vacío (ambos los vas a estudiar a fondo en el módulo 2; por ahora te alcanza con lo que hacen):

cd ~
mkdir lab-nav
cd lab-nav
mkdir photos
mkdir photos/vacation
touch notes.txt
touch .env
touch photos/vacation/beach.jpg

Ninguna de esas líneas imprime nada — sin salida es éxito, como ya viste con otros comandos. Ahora pide el formato largo:

ls -la

Qué esperar (el propietario, el grupo, el tamaño en bloques y la fecha exacta van a variar en tu máquina; la forma de cada línea, no):

total 0
drwxr-xr-x  5 alex  staff  160 21 jul 10:23 .
drwx------ 20 alex  staff  640 21 jul 10:23 ..
-rw-r--r--  1 alex  staff    0 21 jul 10:23 .env
-rw-r--r--  1 alex  staff    0 21 jul 10:23 notes.txt
drwxr-xr-x  3 alex  staff   96 21 jul 10:23 photos

Toma la línea de notes.txt y descompón cada campo, de izquierda a derecha:

-rw-r--r--  1  alex  staff  0  21 jul 10:23  notes.txt
│            │  │     │     │  │              └── nombre
│            │  │     │     │  └── fecha de la última modificación
│            │  │     │     └── tamaño en bytes
│            │  │     └── grupo propietario
│            │  └── usuario propietario
│            └── número de enlaces
└── tipo + permisos (10 caracteres)
  • Tipo + permisos (-rw-r--r--, diez caracteres): el primer carácter es el que te interesa hoy — - para un archivo regular, d para un directorio, l para un enlace simbólico. Los nueve caracteres restantes describen permisos completos para tres clases de usuario distintas, y vas a descifrarlos letra por letra recién en el módulo 4. Por ahora, quédate solo con el primer carácter: te dice de un vistazo si algo es un archivo o una carpeta, sin tener que adivinar por el nombre.
  • Número de enlaces: cuántas referencias apuntan a ese mismo dato en el disco. Para un archivo normal casi siempre es 1. Para un directorio, en un sistema de archivos tradicional (el que corre en la mayoría de servidores Linux) empieza en 2 —él mismo, más su propia entrada .— y sube uno por cada subcarpeta directa que contenga. Si tu máquina es un Mac con APFS (el sistema de archivos por defecto desde 2017), vas a ver un comportamiento distinto: el número sube con cualquier entrada nueva, sea archivo o subcarpeta, no solo con subcarpetas. Si el número no calza con la regla clásica en tu Mac, no es un error tuyo: es una diferencia real de diseño entre sistemas de archivos, no algo que necesites resolver hoy.
  • Propietario y grupo (alex staff): quién es el dueño del archivo y a qué grupo pertenece. Vas a entender el mecanismo completo detrás de estos dos campos —por qué existen, quién puede cambiarlos— en el módulo 4; hoy te alcanza con leerlos.
  • Tamaño: el peso del archivo en bytes. notes.txt pesa 0 porque touch lo creó vacío.
  • Fecha: la última vez que se modificó el contenido del archivo — no cuándo se creó. Si el archivo tiene más de aproximadamente seis meses, ls cambia el formato: en vez de la hora del día, muestra el año, porque a esa distancia la hora exacta deja de ser el dato útil.
  • Nombre: el último campo, sin ambigüedad. Si la entrada fuera un enlace simbólico, aquí verías además una flecha (-> destino) apuntando a lo que ese enlace representa.

Un detalle más: la primera línea, total 0, no es la suma de los tamaños que ves debajo — es la cantidad de bloques de disco reservados para el directorio mismo, en una unidad que depende del sistema de archivos. No te preocupes si no te cierra la cuenta a mano; no está pensada para sumarse con los bytes de la columna de tamaño.


Modificadores de ls: qué filas ves y en qué orden

Ya sabes leer una fila completa. Los siguientes modificadores no cambian lo que significa cada columna — cambian cuáles filas aparecen y en qué orden, según lo que estés buscando en ese momento.

FlagQué hace
-aIncluye archivos ocultos (los que empiezan con .), incluidas . y ..
-hCombinada con -l, muestra el tamaño en unidades legibles (K, M, G) en vez de bytes crudos
-tOrdena por fecha de modificación, del más reciente al más antiguo
-SOrdena por tamaño, del más pesado al más liviano
-RBaja recursivamente por cada subcarpeta, en vez de mostrar solo el nivel actual

Ejemplo trabajado

-a, archivos ocultos. Ya la usaste arriba sin nombrarla aparte: .env apareció en tu listado de lab-nav porque agregaste -a. Sin ella, un ls -l simple lo hubiera saltado por completo — exactamente el comportamiento que viste en la lección anterior con el punto inicial.

-t, ordenar por fecha. Corre esto dentro de lab-nav:

ls -lt

Qué esperar (el orden exacto de tus archivos va a depender de en qué momento exacto corriste cada touch; lo que importa es que el más reciente queda primero):

total 0
-rw-r--r--  1 alex  staff    0 21 jul 10:23 notes.txt
drwxr-xr-x  3 alex  staff   96 21 jul 10:23 photos

notes.txt queda primero porque lo creaste con touch después del último cambio dentro de photos (agregar la subcarpeta vacation) — -t no le importa cuándo se creó cada cosa, solo cuándo fue la última modificación de cada entrada.

(-a no está en este combo, así que .env no aparece — recuerda que los modificadores se combinan libremente: ls -lat te da ambas cosas a la vez.) Esta es la pregunta que respondes con -t: "¿qué toqué más recientemente en esta carpeta?" — la primera que te haces cuando algo cambió y no recuerdas qué.

-S y -h juntos, sobre una carpeta con contenido real. Tu carpeta de práctica tiene puros archivos vacíos, así que ordenar por tamaño ahí no dice mucho. Prueba en tu propia carpeta personal, donde sí hay variedad real:

cd ~
ls -lhS

Qué esperar (tu lista va a ser completamente distinta a la de cualquier otra persona — lo que importa es el criterio: de mayor a menor, con el tamaño ya convertido a K, M o G):

total 48
-rw-r--r--@  1 alex  staff    12K 21 jul 09:47 report.pdf
drwx------@  8 alex  staff   2.1K 20 jul 19:14 Downloads
drwx------@  5 alex  staff   1.4K 15 jul 08:02 Documents
drwxr-xr-x@  5 alex  staff   160B 21 jul 10:23 lab-nav

Esta combinación —-lhS— es exactamente la que corres cuando el disco se está llenando y necesitas saber, sin abrir nada, qué es lo que más pesa. Sin -h estarías leyendo una cifra en bytes crudos (2148, 1434) en vez de 2.1K, 1.4K — técnicamente lo mismo, pero mucho más lento de comparar a simple vista.

-R, recursivo. Vuelve a lab-nav y pide todo el árbol de una sola vez:

cd ~/lab-nav
ls -laR

Qué esperar:

.:
total 0
drwxr-xr-x  5 alex  staff  160 21 jul 10:23 .
drwx------ 20 alex  staff  640 21 jul 10:23 ..
-rw-r--r--  1 alex  staff    0 21 jul 10:23 .env
-rw-r--r--  1 alex  staff    0 21 jul 10:23 notes.txt
drwxr-xr-x  3 alex  staff   96 21 jul 10:23 photos

./photos:
total 0
drwxr-xr-x  3 alex  staff   96 21 jul 10:23 .
drwxr-xr-x  5 alex  staff  160 21 jul 10:23 ..
drwxr-xr-x  3 alex  staff   96 21 jul 10:23 vacation

./photos/vacation:
total 0
drwxr-xr-x  3 alex  staff   96 21 jul 10:23 .
drwxr-xr-x  3 alex  staff   96 21 jul 10:23 ..
-rw-r--r--  1 alex  staff    0 21 jul 10:23 beach.jpg

-R repite el mismo formato de ls -la una vez por cada carpeta que encuentra, bajando nivel por nivel, con un encabezado (./photos:) que te dice en cuál estás parado en cada bloque. Es exhaustivo — y, como vas a ver en un momento, hay una forma más cómoda de mirar exactamente esta misma información.


cd: el verbo que mueve el punto en el mapa

En la lección anterior conociste las señas del árbol: rutas absolutas, rutas relativas, y los atajos ., .., ~. cd (change directory) es el comando que convierte esas señas en movimiento real. Ya construiste lab-nav con una carpeta adentro de otra — úsala para practicar las cuatro formas de moverte que vas a usar todos los días.

Ejemplo trabajado

Ruta relativa, hacia adentro:

cd ~/lab-nav
pwd
cd photos/vacation
pwd

Qué esperar:

/Users/alex/lab-nav
/Users/alex/lab-nav/photos/vacation

photos/vacation no lleva ninguna barra al inicio: se resuelve a partir de tu directorio actual, no desde la raíz. Esa es la regla que ya viste en la lección anterior — aquí la estás aplicando con el comando real.

El atajo .., dos niveles hacia arriba en un solo golpe:

cd ../..
pwd

Qué esperar:

/Users/alex/lab-nav

Cada .. sube un nivel; encadenados con / entre medio, suben varios de una vez. Estás de vuelta en lab-nav sin haber escrito la ruta completa.

~, directo a tu home sin importar dónde estés:

cd ~
pwd

Qué esperar:

/Users/alex

cd sin ningún argumento hace exactamente lo mismo que cd ~ — ambas formas te llevan a tu directorio personal desde cualquier punto del árbol.

-, volver al directorio anterior:

cd ~/lab-nav
cd ~
cd -

Qué esperar (la última línea es la salida real de cd -, no de un pwd aparte):

/Users/alex/lab-nav

A diferencia de cualquier otra forma de cd, que no imprime nada si funciona, cd - sí imprime la ruta a la que te movió — es la única pista visual que te confirma hacia dónde saltaste. Por dentro, cd - es básicamente cd $OLDPWD: tu shell guarda sola, en esa variable, cuál era tu directorio justo antes del último cd (vas a conocer las variables de entorno a fondo en el módulo 4). Es útil para saltar entre dos carpetas de trabajo sin escribir la ruta completa cada vez — corre cd - de nuevo ahora mismo y vas a volver a lab-nav.

Ruta absoluta, para llegar sin depender de dónde estés parado:

cd /Users/alex/lab-nav/photos
pwd

Funciona sin importar en qué carpeta hayas estado un segundo antes — esa es la ventaja de empezar con /, como ya sabes de la lección anterior.


tree: el árbol completo, no una rama a la vez

Hasta acá, cada vez que quisiste ver qué había más abajo, tuviste que bajar con cd o pedir -R, que te devuelve el contenido en bloques separados por carpeta. Si el sistema de archivos es un árbol —la idea central de la lección anterior— hasta ahora solo pudiste mirar una rama a la vez. tree dibuja el árbol completo, desde la raíz que le indiques hasta la última hoja, en una sola imagen de texto.

Ejemplo trabajado

cd ~/lab-nav
tree

Qué esperar, si tree está instalado:

.
├── notes.txt
└── photos
    └── vacation
        └── beach.jpg

3 directories, 2 files

(Por defecto, tree no muestra archivos ocultos — por eso .env no aparece aquí; agrega -a para incluirlos, igual que con ls.) Es la misma información que ya viste con ls -laR, pero dibujada como jerarquía en vez de listada en bloques de texto plano — más rápida de leer cuando lo que quieres es la forma completa del árbol, no el detalle línea por línea de cada archivo.

Qué esperar si tree no está instalado (el caso más común: no viene preinstalado por defecto ni en macOS ni en la mayoría de distribuciones Linux):

zsh: command not found: tree

Ya conoces este mensaje de la lección 4: la shell buscó un programa con ese nombre exacto en tu PATH y no lo encontró. Dos caminos, según la máquina en la que estés:

  • Si puedes instalar paquetes (tu propia laptop): en macOS con Homebrew, brew install tree; en Ubuntu, Debian o dentro de WSL, sudo apt install tree; en Fedora, sudo dnf install tree.
  • Si no puedes (un servidor ajeno, un contenedor sin acceso de instalación): ya tienes un sustituto exacto, sin instalar nada — ls -laR, que acabas de usar. No dibuja el árbol tan lindo, pero te da exactamente la misma información completa.

Errores comunes

1. Asumir que una ruta relativa se resuelve desde donde "debería" estar el archivo, no desde tu directorio actual (conceptual). Qué pasa: escribes cd photos estando en tu home en vez de estar dentro de lab-nav, y la terminal responde:

-bash: cd: photos: No such file or directory

Ya conoces este mensaje de la lección 4 —significa que el programa (aquí, cd) sí arrancó, pero uno de sus argumentos no existe donde lo buscó—. Por qué ocurre: quien recién empieza asume que una ruta relativa como photos se resuelve "desde donde vive el archivo" o "desde el home", cuando en realidad se resuelve siempre desde tu directorio actual real, sin excepción — y ese directorio puede no ser el que asumes si perdiste la cuenta de dónde estás. También puede ser una trampa de mayúsculas: si escribiste cd Photos en Linux teniendo una carpeta photos en minúscula, el sistema distingue mayúsculas de minúsculas —la trampa exacta que viste en la lección anterior— y el resultado es el mismo error. Cómo detectarlo: el mensaje nombra específicamente la ruta que no encontró, no el comando. Cómo corregirlo: pwd primero, siempre, para confirmar desde dónde se está resolviendo esa ruta relativa antes de escribirla; si el nombre parece correcto, revisa mayúsculas y minúsculas letra por letra.

2. Intentar cd hacia un archivo, no una carpeta. Qué pasa: escribes cd notes.txt (un archivo real dentro de lab-nav) y la terminal responde algo como:

-bash: cd: notes.txt: Not a directory

Por qué ocurre: cd solo sabe moverte entre directorios; notes.txt existe, y por eso el mensaje no es "No such file or directory" —lo encontró—, pero no es un lugar al que puedas entrar, es un archivo con contenido. La confusión típica es asumir que cualquier nombre que aparece en un ls es un destino válido para cd, sin fijarse en el primer carácter del ls -l (- de archivo frente a d de directorio) que ya aprendiste arriba. Cómo detectarlo: el mensaje dice explícitamente "Not a directory" —distinto de "No such file or directory"—, así que el nombre sí existe, solo que no es el tipo de entrada que cd necesita. Cómo corregirlo: usa ls -l sobre ese nombre y mira el primer carácter antes de intentar entrar; si es -, necesitas otro comando (para leerlo, no para entrar a él) — el que vas a conocer en el módulo 2.

3. Permission denied al intentar entrar a una carpeta que no te pertenece. Qué pasa: en Linux o dentro de WSL, intenta:

cd /root

En macOS, el equivalente es:

cd /private/var/root

Qué esperar en Linux o WSL, si no estás usando la cuenta root (lo normal en el día a día):

-bash: cd: /root: Permission denied

Y en macOS, el mismo tipo de mensaje sobre la otra ruta:

-bash: cd: /private/var/root: Permission denied

Por qué ocurre: esa carpeta es el directorio personal de la cuenta root, y sus permisos están configurados a propósito para que nadie más pueda entrar, ni siquiera para mirar qué contiene. No es un archivo dañado ni un error de tu terminal: el sistema te negó el acceso porque así fue configurado. El mecanismo completo detrás de esto —quién decide, cómo se lee, cómo se cambia— es exactamente el tema del módulo 4; hoy te alcanza con reconocer el mensaje y saber que no tiene arreglo con un comando distinto, sino con permisos que hoy no tienes. Cómo detectarlo: el mensaje termina en "Permission denied", ni "No such file or directory" (la ruta existe) ni "Not a directory" (sí es una carpeta). Cómo corregirlo: en el día a día, no lo corriges tú — o no necesitas entrar ahí, o necesitas privilegios que vas a aprender a pedir con criterio más adelante en la guía.


Ejercicios

1. Lee la etiqueta completa. Tienes esta línea, tomada de un ls -l:

-rw-r--r--  1 mia  developers  4096  15 mar  2025  budget.xlsx

Sin tocar todavía la columna de permisos completa (eso es el módulo 4): ¿es un archivo o una carpeta?, ¿quién es el propietario?, ¿a qué grupo pertenece?, ¿cuántos bytes pesa?, ¿cuándo se modificó por última vez?

Ver solución

Es un archivo (el primer carácter es -, no d). El propietario es mia. El grupo es developers. Pesa 4096 bytes. Se modificó por última vez el 15 mar 2025 — y como la fecha muestra el año en vez de una hora, es una pista de que pasaron más de unos seis meses desde esa modificación hasta hoy.

Por qué funciona: cada uno de estos datos vive en una posición fija de la línea, sin importar el archivo — el mismo orden que viste con notes.txt en el ejemplo trabajado: tipo+permisos, enlaces, propietario, grupo, tamaño, fecha, nombre.

2. El camino más corto. Estás parado en ~/lab-nav/photos/vacation. Usando solo lo que aprendiste en esta lección (rutas relativas, .., ~, -), escribe la secuencia más corta de comandos cd para llegar a tu directorio personal (~) y luego volver exactamente a ~/lab-nav/photos/vacation sin escribir la ruta completa la segunda vez.

Ver solución
cd ~
cd -

Por qué funciona: cd ~ te lleva al home en un solo paso, sin necesitar ningún .. (mucho más corto que cd ../../..). Una vez ahí, cd - te devuelve exactamente al directorio del que acabas de salir —$OLDPWD—, sin volver a escribir ~/lab-nav/photos/vacation.

3. Elige el flag correcto. Para cada tarea, indica qué combinación de flags de ls usarías: (a) ver, en tu carpeta de Descargas, cuál es el archivo más pesado, con el tamaño en unidades legibles; (b) confirmar si una carpeta de configuración tiene algún archivo oculto que no habías notado; (c) ver la estructura completa de un proyecto, carpeta por carpeta, sin entrar a cada una con cd.

Ver solución

(a) ls -lhS-S ordena de mayor a menor peso, -h convierte los bytes a K/M/G para que se lea de un vistazo. (b) ls -la-a muestra también las entradas que empiezan con .. (c) ls -laR (o tree, si está instalado) — -R baja recursivamente por cada subcarpeta en un solo comando.

Por qué funciona: cada flag responde una pregunta distinta —qué pesa más, qué está oculto, qué hay más abajo— y se combinan libremente porque cada uno filtra u ordena de forma independiente.

4. Diagnostica sin ejecutar. Un compañero te manda estos tres mensajes de error, sin más contexto, y te pregunta a qué se debe cada uno: (a) cd: /home/user/proyecto: No such file or directory; (b) cd: informe.pdf: Not a directory; (c) cd: /etc/ssl/private: Permission denied. Explica cada uno en una frase, sin correr nada todavía.

Ver solución

(a) La ruta /home/user/proyecto no existe donde el sistema la buscó — probablemente un nombre mal escrito, una carpeta que se movió, o una diferencia de mayúsculas/minúsculas. (b) informe.pdf sí existe, pero es un archivo, no una carpeta — cd no puede entrar a algo que no tiene contenido navegable. (c) /etc/ssl/private existe y es una carpeta, pero sus permisos están configurados para que la cuenta actual no pueda entrar — algo deliberado, no un archivo roto (con razón: en muchos sistemas ahí viven llaves privadas de servidor).

Por qué funciona: los tres mensajes son literalmente distintos entre sí porque describen tres causas distintas —no existe, no es una carpeta, existe pero no autorizado— y esa distinción textual es la única pista que necesitas antes de decidir qué corregir.


Resumen y siguiente paso

Antes de avanzar deberías poder:

  • confirmar con pwd en qué directorio estás parado, sin depender de lo que muestre tu prompt;
  • leer cualquier línea de ls -l campo por campo —tipo, enlaces, propietario, grupo, tamaño, fecha, nombre— y combinar -a, -h, -t, -S y -R según lo que necesites ver;
  • moverte con cd usando ruta relativa, ruta absoluta, ~ y -, sin tener que pensar cada paso;
  • ver la estructura completa de una carpeta con tree, o con ls -laR si tree no está disponible;
  • distinguir No such file or directory, Not a directory y Permission denied con solo leer el mensaje, y saber qué familia de causa tiene cada uno.

Ya tienes las herramientas para orientarte en cualquier máquina que se ponga frente a ti, conocida o no. Lo que te falta ahora no es un comando nuevo: es practicarlo sobre tu propia máquina real, sin red de protección artificial. Eso es exactamente el proyecto que sigue —doce preguntas concretas sobre tu propio sistema de archivos, cada una respondida con el comando exacto que la produjo.


Recursos