Linux / Comando / cd: cambiar de directorio y evitar rutas equivocadas
cd es un comando en la shell de Linux que cambia el directorio de trabajo actual. Se puede mover usando rutas absolutas o relativas, y sin argumentos se puede ir al directorio home o con cd - se puede volver al directorio anterior.
cd debe cambiar el estado de la shell actual, por lo que no es un archivo ejecutable externo, sino un comando interno de la shell. Este artículo explica, basándose en Bash, cómo moverse entre directorios, manejar enlaces simbólicos, usar CDPATH y su uso seguro en scripts.
¿Qué es el comando cd?
cd es la abreviatura de change directory, y cambia el directorio de trabajo actual (current working directory) de la shell. Después, los comandos ejecutados con rutas relativas buscarán archivos y directorios basándose en el directorio cambiado.
La ubicación actual se puede verificar con pwd.
pwd
cd /var/log
pwd
Al ejecutar type cd, se puede comprobar que es un comando integrado de Bash. Si se ejecutara como un programa separado, solo cambiaría el directorio del proceso hijo y no afectaría al shell padre, por lo que la shell lo implementa directamente.
Sintaxis básica
cd [-L] [-@] [DIRECTORIO]
cd -P [-e] [-@] [DIRECTORIO]
Normalmente, solo se especifica el directorio al que se desea mover.
cd /etc
cd projects
Si el movimiento tiene éxito, devuelve el estado de salida 0, y si la ruta no existe o no hay permisos, devuelve un valor distinto de 0. En scripts donde es importante el éxito, se debe verificar el estado de salida.
Moverse usando rutas absolutas y relativas
Usar rutas absolutas
Las rutas absolutas que comienzan desde el directorio raíz / apuntan al mismo destino independientemente de la ubicación actual.
cd /var/log
cd /usr/local/bin
cd /
Si en los procedimientos operativos o scripts la ubicación de referencia debe ser clara, las rutas absolutas son fáciles de entender.
Usar rutas relativas
Las rutas relativas se interpretan en relación con el directorio de trabajo actual.
cd documents
cd projects/web
cd ../backup
Incluso el mismo comando puede moverse a un directorio diferente o fallar según la ubicación desde la que se ejecute. Si la ubicación antes y después del movimiento es importante, verifíquelo con pwd.
Moverse al directorio de inicio, al superior y al anterior
Ir al directorio de inicio
Si se ejecuta cd sin argumentos, se moverá al directorio personal del usuario especificado por la variable HOME. La expansión de la tilde usada en cd ~ generalmente produce el mismo resultado.
cd
cd ~
cd ~/Downloads
El directorio personal de otros usuarios se puede referenciar como ~USUARIO según la información de la cuenta del sistema.
cd ~alice
Si ese usuario no existe o no tiene permisos para acceder a la ruta del hogar, no se puede mover.
Representando el directorio actual y el superior
Un punto . significa el directorio actual, y dos puntos .. significan el directorio superior.
cd .
cd ..
cd ../..
cd ../../shared
cd . normalmente no cambia de ubicación. Para moverse varios niveles hacia arriba, se usa ../ para cada nivel. La función de interpretar tres puntos como dos niveles superiores, como en ..., no es un comportamiento estándar de Bash.
Volver al directorio anterior con cd -
cd - se mueve al directorio de trabajo anterior almacenado en OLDPWD y, si tiene éxito, imprime la nueva ruta.
cd /etc
cd /var/log
cd -
Es conveniente al alternar entre dos directorios. Si la información del directorio anterior aún no se ha creado en el shell actual, puede ocurrir el error OLDPWD not set.
Rutas con espacios y caracteres especiales
Envolver las rutas entre comillas
Las rutas con espacios se colocan entre comillas para pasarlas como un solo argumento.
cd "Project Files"
cd '/srv/shared data'
También es seguro poner entre comillas los valores de las variables cuando se usan como rutas, para que no se dividan en varias palabras o se expandan mediante glob.
target='/srv/shared data'
cd -- "$target"
Nombres con barra invertida y que parecen opciones
También se puede poner una barra invertida antes de los espacios para escaparlos.
cd Project\ Files
Si un nombre comienza con un guion, se puede anteponer ./ o usar un marcador de fin de opciones -- para que no se confunda con una opción.
cd ./-archive
cd -- -archive
Al usar la autocompletación de pestañas, la shell escapará adecuadamente los espacios y caracteres especiales en las rutas, lo que puede reducir los errores tipográficos.
Comprender PWD y OLDPWD
PWD que indica la ubicación actual
Bash almacena el nuevo directorio de trabajo en la variable PWD si el cambio se realiza con éxito. Puede verificar la ruta lógica que la shell recuerda comparando con el comando pwd.
printf '%s\n' "$PWD"
pwd
~+ también se reemplaza por el valor de PWD en la expansión de tilde de Bash.
printf '%s\n' ~+
OLDPWD que indica la ubicación anterior
Si el cambio se realiza con éxito, el directorio de trabajo anterior se almacena en OLDPWD. cd - utiliza este valor.
printf '%s\n' "$OLDPWD"
printf '%s\n' ~-
Justo después de iniciar la shell o si aún no se ha cambiado de directorio, OLDPWD puede no existir.
Enlaces simbólicos y opciones -L, -P
En rutas que incluyen enlaces simbólicos, la ruta lógica que recuerda la shell puede diferir de la ruta física interpretada por el sistema de archivos.
Mantener la ruta lógica con -L
-L es el comportamiento predeterminado y procesa .. basándose en los componentes de la ruta lógica. Si se navegó a través del nombre de un enlace simbólico, ese nombre puede mantenerse también en PWD.
cd -L /srv/current
pwd
Mantiene la estructura de la ruta ingresada por el usuario, por lo que es fácil de entender al trabajar siguiendo enlaces de proyecto o enlaces de la versión actual.
Seguir la ruta física con -P
-P interpreta los enlaces simbólicos como la ruta física de destino durante la navegación. Se usa cuando se necesita verificar la ubicación real en el sistema de archivos o procesar .. en función del destino del enlace.
cd -P /srv/current
pwd -P
-e, cuando se usa junto con -P, devuelve un estado de error si no se puede determinar la ruta física actual después de moverse.
cd -P -e /srv/current
Buscar ubicaciones a las que se accede frecuentemente con CDPATH
CDPATH es una lista de búsqueda para ciertos operandos relativos de cd. No interviene cuando el operando es absoluto o su primer componente es . o ..; por eso ./build expresa de forma explícita el directorio de referencia. No confunda esta lista con PATH, utilizada para encontrar ejecutables.
Ejemplo de configuración de CDPATH
CDPATH=.:~/projects:/srv/apps
export CDPATH
cd sample-app
Se busca sample-app en cada ubicación separada por dos puntos. Una entrada vacía o . se refiere al directorio actual. Para dar prioridad a un nombre igual en la ubicación actual, es más fácil de entender si se pone . al principio.
Puntos a tener en cuenta al usar CDPATH
Si se busca un directorio en una entrada de CDPATH que no está vacía, cd puede mostrar en la salida estándar la ruta absoluta a la que se ha movido. Es conveniente en un shell interactivo, pero en la salida de un script pueden mezclarse rutas inesperadas.
En la automatización, use rutas absolutas o rutas relativas claras, y si es necesario, use CDPATH= para eliminar la influencia de la ruta de búsqueda en ese comando.
CDPATH= cd -- ./build
Ejecutar el siguiente comando solo si el cambio se realizó con éxito
Si cd falla y el programa continúa, una tarea posterior puede actuar sobre una ubicación equivocada. Los nombres /srv/app, deploy.sh, build.sh y maintenance.sh representan una aplicación y scripts que debe preparar y revisar; los ejemplos no los crean. Empiece con carpetas de prueba y encadene el trabajo al éxito de cd.
cd /srv/app && ./deploy.sh
En scripts de varias líneas, se debe salir explícitamente o manejar errores en caso de fallo.
cd /srv/app || {
printf '%s\n' 'No se pudo acceder al directorio de trabajo.' >&2
exit 1
}
./deploy.sh
Si solo se usa un punto y coma como en cd RUTA; COMANDO, el siguiente comando se ejecutará independientemente de si el movimiento falla.
Usar cd en scripts y sub-shells
Razón por la que un script no puede cambiar la ubicación del shell padre
Un script de shell ejecutado normalmente funciona en un proceso separado, por lo que cd dentro del script solo afecta a ese proceso y sus hijos. Después de que el script termina, el directorio de trabajo del terminal que llamó sigue siendo el mismo.
./change-directory.sh
pwd
Para cambiar la ubicación del shell actual, se puede definir una función o ejecutar el script con source, pero un script 'sourceado' puede cambiar incluso las variables y opciones del shell actual, por lo que se debe verificar que sea contenido confiable.
source ./change-directory.sh
Sub-shell que mantiene la ubicación original después de trabajar
Para trabajar solo en un directorio específico y mantener la ubicación del shell que lo invocó, se puede crear un subshell con paréntesis.
(
cd /srv/app && ./build.sh
)
Los cambios de directorio dentro de los paréntesis desaparecen cuando termina el subshell. Para moverse y volver en el shell actual, en lugar de guardar directamente la ruta existente, también se pueden usar pushd y popd.
Razón por la que sudo cd no funciona
sudo cd /root generalmente no está disponible. cd es un comando incorporado del shell actual, y sudo no puede cambiar el directorio de trabajo del shell padre porque es iniciado por otro proceso.
sudo -i abre otro shell de inicio de sesión con privilegios si la política lo permite. Su directorio y entorno pueden cambiar; verifíquelos antes de trabajar y utilice exit para salir. No necesita un shell de administrador para practicar la navegación normal.
sudo -i
Para ejecutar un solo comando como administrador en un directorio específico, después de moverse en el shell actual, aplique sudo solo a ese comando o especifique la ruta de trabajo y el comando en un shell separado.
cd /srv/app && sudo ./maintenance.sh
sudo sh -c 'cd /srv/app && ./maintenance.sh'
Use los privilegios de administrador solo en la medida necesaria y asegúrese de que la ruta y el archivo ejecutable sean confiables.
Comparación de cd, pushd y popd
| Comando | Uso principal | Características |
|---|---|---|
cd |
Se mueve al directorio especificado. | Puede regresar a la ubicación anterior usando OLDPWD. |
pushd |
Se mueve mientras guarda la ubicación actual en la pila de directorios. | Es útil cuando se alterna entre varias ubicaciones y Bash gestiona la pila. |
popd |
Elimina un elemento de la pila y se mueve a esa ubicación. | Se empareja con pushd y restaura la ubicación guardada. |
dirs |
Verifica la pila de directorios actual. | Puede mostrar solo el estado de la pila sin moverse. |
| Comando | Descripción |
|---|---|
cd |
Se mueve al directorio de inicio del usuario actual. |
cd ~ |
Se mueve al directorio de inicio usando la expansión de la tilde. |
cd .. |
Se mueve al directorio superior. |
cd ../.. |
Se mueve dos niveles arriba en el directorio. |
cd - |
Vuelve al directorio de trabajo anterior. |
cd / |
Se mueve al directorio raíz del sistema de archivos. |
cd ~/projects |
Se mueve al directorio projects debajo del inicio. |
cd -P RUTA |
Se mueve siguiendo la ruta física interpretada de enlaces simbólicos. |
Organización de opciones
| Opciones | Descripción |
|---|---|
-L |
Se utiliza la ruta lógica. Este es el comportamiento predeterminado de Bash y permite mantener el nombre del enlace simbólico en la ruta. |
-P |
Interpreta los enlaces simbólicos como la ruta del destino físico y se mueve a ella. |
-e |
Se usa junto con -P, y devuelve un estado de fallo si no puede determinar la ruta actual física después de moverse. |
-@ |
En sistemas compatibles, muestra los atributos extendidos de archivos como si fueran directorios. En un entorno Linux común, puede que no esté soportado. |
-- |
Indica el final de las opciones y se usa cuando se pasan nombres de directorios que comienzan con un guion como argumentos. |
Errores frecuentes
No existe el archivo o directorio
La ruta puede no existir o puede haberse asumido incorrectamente la ubicación actual. Verifique la ubicación de referencia con pwd y revise las mayúsculas, minúsculas y espacios de la ruta.
pwd
ls -ld -- "RUTA OBJETIVO"
Permiso denegado
Es posible que no tenga permisos de navegación en el directorio de destino o en algún directorio intermedio de la ruta. Para moverse a un directorio, necesita permisos de ejecución en cada directorio que compone la ruta.
namei -l /path/to/directory
Antes de ampliar los permisos arbitrariamente, verifique si es el usuario que debe acceder a esa ruta y revise los grupos o listas de control de acceso (ACL) y políticas de seguridad aplicables.
No es un directorio
El último elemento de la ruta o algún componente intermedio puede ser un archivo normal. Verifique los tipos con file y ls -ld.
file -- "RUTA OBJETIVO"
ls -ld -- "RUTA OBJETIVO"
FAQ
¿Es normal no obtener ninguna salida al ejecutar el comando cd?
Es normal. No se muestra salida al cambiar a una ruta común con éxito con cd. La ubicación actual se puede verificar con pwd, y las rutas encontradas con cd - o CDPATH pueden mostrar la nueva ruta si la operación es exitosa.
¿Cómo se puede mover dos niveles hacia el directorio superior?
Se utiliza cd ../... Cada .. representa un nivel en el directorio superior y se conecta con una barra diagonal.
¿Es posible cambiar el directorio del terminal actual mediante un script?
Un script ejecutado normalmente no puede cambiar el directorio del shell padre. Para afectar al shell actual se requiere una función de shell o source, pero dado que también puede cambiar otros estados del shell actual, úselo solo con código de confianza.
Compare otras herramientas en Lista de comandos de uso frecuente en Linux. Para las reglas de navegación y expansión, consulte Manual de GNU Bash: comando built-in cd, Manual de GNU Bash: expansión de la tilde y Definición de variables de entorno POSIX: CDPATH.




