Capítulo 4. Navegando por el Sistema de Archivos

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

En la película Las aventuras de Buckaroo Banzai en la 8ª Dimensión, una comedia clásica de culto de 1984, el espadachín personaje del título ofrece las siguientes palabras de sabiduría zen: "Recuerda, vayas donde vayas... ahí estás". Buckaroo bien podría haber estado hablando del sistema de archivos Linux:

$ cd /usr/share/lib/etc/bin              No matter where you go...
$ pwd
/usr/share/lib/etc/bin                   ...there you are.

También ocurre que dondequiera que estés en el sistema de archivos de Linux -tu directorio actual- acabarás yendo a otro lugar (a otro directorio). Cuanto más rápida y eficazmente puedas realizar esta navegación, más productivo serás.

Las técnicas de este capítulo te ayudarán a navegar por el sistema de archivos más rápidamente y tecleando menos. Parecen aparentemente sencillas, pero son muy rentables, con pequeñas curvas de aprendizaje y grandes beneficios. Estas técnicas se dividen en dos grandes categorías:

  • Moverse rápidamente a un directorio específico

  • Volver rápidamente a un directorio que has visitado antes

Para un rápido repaso de los directorios de Linux, consulta el Apéndice A. Si utilizas un intérprete de comandos distinto de bash, consulta el Apéndice B para obtener notas adicionales.

Visitar eficazmente directorios específicos

Si preguntas a 10 expertos en Linux cuál es el aspecto más tedioso de la línea de comandos, siete de ellos responderán: "Escribir largas rutas de directorio".1 Al fin y al cabo, si tus archivos de trabajo están en/home/mañana/Trabajo/Proyectos/Aplicaciones/Neutron-Star/src/include, tus documentos financieros están en/home/mañana/Finanzas/Banco/Cheques/Declaraciones, y tus vídeos están en /data/Artes/Vídeo/Colección, no es divertido volver a escribir estas rutas una y otra vez. En esta sección, aprenderás técnicas para navegar a un directorio determinado de forma eficiente.

Saltar a tu directorio de inicio

Empecemos por lo básico. Vayas donde vayas en el sistema de archivos, puedes volver a tu directorio raíz ejecutando cd sin argumentos:

$ pwd
/etc                              Start somewhere else
$ cd                              Run cd with no arguments...
$ pwd
/home/smith                       ...and you're home again

Para saltar a subdirectorios dentro de tu directorio personal desde cualquier parte del sistema de archivos, haz referencia a tu directorio personal con una abreviatura en lugar de una ruta absoluta como /home/smith. Una abreviatura es la variable de shell HOME:

$ cd $HOME/Work

Otra es la tilde:

$ cd ~/Work

Tanto $HOME como ~ son expresiones expandidas por el intérprete de comandos, hecho que puedes comprobar enviándolas por eco a stdout:

$ echo $HOME ~
/home/smith /home/smith

La tilde también puede referirse al directorio personal de otro usuario si la colocas inmediatamente delante de su nombre de usuario:

$ echo ~jones
/home/jones

Muévete más rápido con la finalización por pestañas

Cuando introduzcas comandos cd, ahorra tecleando pulsando la tecla Tabulador para producir nombres de directorio automáticamente. Como demostración, visita un directorio que contenga subdirectorios, como /usr:

$ cd /usr
$ ls
bin  games  include  lib  local  sbin  share  src

Supongamos que quieres visitar el subdirectorio Compartir. Escribe sha y pulsa una vez la tecla Tabulador:

$ cd sha<Tab>

El intérprete de comandos completa el nombre del directorio por ti:

$ cd share/

Este práctico atajo se llama completar tabulación. Funciona inmediatamente cuando el texto que has escrito coincide con un único nombre de directorio. Cuando el texto coincide con varios nombres de directorio, tu shell necesita más información para completar el nombre deseado. Supongamos que sólo has escrito s y has pulsado Tabulador:

$ cd s<Tab>

El intérprete de comandos no puede completar el nombre compartir (todavía) porque otros nombres de directorio también empiezan por s: sbin y src. Pulsa Tabulador una segunda vez y el intérprete de comandos imprimirá todas las terminaciones posibles para guiarte:

$ cd s<Tab><Tab>
sbin/  share/  src/

y espera tu próxima acción. Para resolver la ambigüedad, escribe otro carácter, h, y pulsa Tab una vez:

$ cd sh<Tab>

El intérprete de comandos completa el nombre del directorio por ti, de sh a compartir:

$ cd share/

En general, pulsa Tabulador una vez para realizar la mayor compleción posible, o pulsa dos veces para imprimir todas las compleciones posibles. Cuantos más caracteres escribas, menos ambigüedad y mejor será la coincidencia.

El tabulador es estupendo para acelerar la navegación. En lugar de escribir una ruta larga como /home/smith/Proyectos/Web/src/include, escribe tan poco como quieras y mantén pulsada la tecla Tabulador. Le cogerás el truco rápidamente con la práctica.

Pestaña Finalización Varía según el Programa

El tabulador no es sólo para los comandos de cd. Funciona para la mayoría de los comandos, aunque su comportamiento puede diferir. Cuando el comando escd, la tecla Tab completa los nombres de directorio. Para otros comandos que operan sobre archivos, como cat, grep, y sort, el completado con tabulador también expande los nombres de archivo. Si el comando es ssh (shell seguro), completa los nombres de host. Si el comando es chown (cambiar el propietario de un archivo), completa los nombres de usuario. Incluso puedes crear tus propias reglas de completado para mayor rapidez, como veremos en el Ejemplo 4-1. Consulta también man bash y lee su tema "Finalización programable".

Salta a directorios visitados con frecuencia utilizando alias o variables

Si visitas con frecuencia un directorio lejano, como/home/smith/Trabajo/Proyectos/Web/src/include, crea un alias que realice la operación cd:

# In a shell configuration file:
alias work="cd $HOME/Work/Projects/Web/src/include"

Sólo tienes que ejecutar el alias en cualquier momento para llegar a tu destino:

$ work
$ pwd
/home/smith/Work/Projects/Web/src/include

También puedes crear una variable que contenga la ruta del directorio:

$ work=$HOME/Work/Projects/Web/src/include
$ cd $work
$ pwd
/home/smith/Work/Projects/Web/src/include
$ ls $work/css                                Use the variable in other ways
main.css  mobile.css

Editar archivos editados frecuentemente con un alias

A veces, la razón para visitar un directorio con frecuencia es editar un archivo concreto. Si ese es el caso, considera la posibilidad de definir un alias para editar ese archivo por la ruta absoluta sin cambiar de directorio. La siguiente definición de alias te permite editar $HOME/.bashrc, sin importar en qué parte del sistema de archivos te encuentres, ejecutando rcedit. No se necesita cd:

# Place in a shell configuration file and source it:
alias rcedit='$EDITOR $HOME/.bashrc'

Si visitas regularmente muchos directorios con rutas largas, puedes crear alias o variables para cada uno de ellos. Sin embargo, este enfoque tiene algunas desventajas:

  • Es difícil recordar todos esos alias/variables.

  • Podrías crear accidentalmente un alias con el mismo nombre que un comando existente, provocando un conflicto.

Una alternativa es crear una función shell como la que aparece enEjemplo 4-1, a la que he llamado qcd ("cd rápido"). Esta función acepta una clave de cadena como argumento, como work o recipes, y ejecutacd hacia una ruta de directorio seleccionada.

Ejemplo 4-1. Una función para cd-ing a directorios lejanos
# Define the qcd function
qcd () {
  # Accept 1 argument that's a string key, and perform a different
  # "cd" operation for each key.
  case "$1" in
    work)
      cd $HOME/Work/Projects/Web/src/include
      ;;
    recipes)
      cd $HOME/Family/Cooking/Recipes
      ;;
    video)
      cd /data/Arts/Video/Collection
      ;;
    beatles)
      cd $HOME/Music/mp3/Artists/B/Beatles
      ;;
    *)
      # The supplied argument was not one of the supported keys
      echo "qcd: unknown key '$1'"
      return 1
      ;;
  esac
  # Helpfully print the current directory name to indicate where you are
  pwd
}
# Set up tab completion
complete -W "work recipes video beatles" qcd

Guarda la función en un archivo de configuración del intérprete de comandos, como$HOME/.bashrc (consulta "Entornos y archivos de inicialización, la versión abreviada"), obtén el código fuente y estará lista para ejecutarse. Escribe qcd seguido de una de las teclas admitidas para visitar rápidamente el directorio asociado:

$ qcd beatles
/home/smith/Music/mp3/Artists/B/Beatles

Como extra, la línea final del script ejecuta el comando complete, un shell builtin que configura el completado de tabulador personalizado para qcd, de modo que completa las cuatro teclas admitidas. Ahora ya no tienes que recordar los argumentos deqcd. Sólo tienes que escribir qcd seguido de un espacio y pulsar dos veces la tecla Tabulador, y el intérprete de comandos imprimirá todas las teclas para tu referencia, y podrás completar cualquiera de ellas de la forma habitual:

$ qcd <Tab><Tab>
beatles  recipes  video    work
$ qcd v<Tab><Enter>                       Completes 'v' to 'video'
/data/Arts/Video/Collection

Haz que un sistema de archivos grande parezca más pequeño con CDPATH

La función qcd sólo maneja los directorios que especifiques. El shell proporciona una solución más general cd-ing sin este inconveniente, denominada ruta de búsqueda cd. Esta función del shell transformó mi forma de navegar por el sistema de archivos de Linux.

Supón que tienes un subdirectorio importante que visitas a menudo, llamadoFotos. Se encuentra en /home/smith/Family/Memories/Photos. Mientras navegas por el sistema de archivos, siempre que quieras llegar al directorioFotos, tendrás que escribir una ruta larga, como por ejemplo

$ cd ~/Family/Memories/Photos

¿No sería estupendo que pudieras acortar esta ruta a sólo Fotos, sin importar en qué parte del sistema de archivos te encuentres, y llegar a tu subdirectorio?

$ cd Photos

Normalmente, este comando fallaría:

bash: cd: Photos: No such file or directory

a menos que por casualidad te encuentres en el directorio principal correcto(~/Familia/Memorias) o en algún otro directorio con un subdirectorio Fotos. Pues bien, con una pequeña configuración, puedes ordenar a cd que busque tu subdirectorio Fotos en ubicaciones distintas de tu directorio actual. La búsqueda es rapidísima y sólo busca en los directorios padre que especifiques. Por ejemplo, puedes indicar a cd que busque en $HOME/Familia/Memorias además de en el directorio actual. Entonces, cuando escribas cd Photos desde cualquier otro lugar del sistema de archivos, cd tendrá éxito:

$ pwd
/etc
$ cd Photos
/home/smith/Family/Memories/Photos

Una ruta de búsqueda cd funciona como tu ruta de búsqueda de comandos, $PATH, pero en lugar de encontrar comandos, encuentra subdirectorios. Configúrala con la variable de shell CDPATH, que tiene el mismo formato que PATH: una lista de directorios separados por dos puntos. Si tu CDPATH consta de estos cuatro directorios, por ejemplo:

$HOME:$HOME/Projects:$HOME/Family/Memories:/usr/local

y tecleas:

$ cd Photos

entonces cd comprobará la existencia de los siguientes directorios en orden, hasta que encuentre uno o falle por completo:

  1. Fotos en el directorio actual

  2. $HOME/Fotos

  3. $HOME/Proyectos/Fotos

  4. $HOME/Familia/Memorias/Fotos

  5. /usr/local/Fotos

En este caso, cd tiene éxito en su cuarto intento y cambia el directorio a$HOME/Familia/Memorias/Fotos. Si dos directorios de $CDPATH tienen un subdirectorio llamado Fotos, gana el anterior.

Nota

Normalmente, un cd correcto no imprime ninguna salida. Sin embargo, cuando cd localiza un directorio utilizando tu CDPATH, imprime la ruta absoluta en stdout para informarte de tu nuevo directorio actual:

$ CDPATH=/usr     Set a CDPATH
$ cd /tmp         No output: CDPATH wasn't consulted
$ cd bin          cd consults CDPATH...
/usr/bin          ...and prints the new working directory

Llena CDPATH con tus directorios padre más importantes o utilizados con frecuencia, y podrás cd en cualquiera de sus subdirectorios desde cualquier lugar del sistema de archivos, sin importar su profundidad, sin tener que escribir la mayor parte de la ruta. Créeme, esto es increíble, y el siguiente caso práctico debería demostrarlo.

Organiza tu directorio de inicio para una navegación rápida

Utilicemos CDPATH para simplificar la forma en que navegas por tu directorio personal. Con un poco de configuración, puedes hacer que muchos directorios de tu directorio personal sean fácilmente accesibles con un tecleo mínimo, sin importar en qué parte del sistema de archivos te encuentres. Esta técnica funciona mejor si tu directorio raíz está bien organizado, con al menos dos niveles de subdirectorios. La Figura 4-1 muestra un ejemplo de una disposición de directorios bien organizada.

Two levels of subdirectories in the directory /home/smith
Figura 4-1. Dos niveles de subdirectorios en el directorio /home/smith

El truco está en configurar tu CDPATH para que incluya, por orden:

  1. $HOME

  2. Los subdirectorios de $HOME

  3. La ruta relativa de un directorio padre, indicada por dos puntos (..)

Incluyendo $HOME, puedes saltar inmediatamente a cualquiera de sus subdirectorios(Familia, Finanzas, Linux, Música y Trabajo) desde cualquier otro lugar del sistema de archivos sin escribir una ruta inicial:

$ pwd
/etc                                   Begin outside your home directory
$ cd Work
/home/smith/Work
$ cd Family/School                     You jumped 1 level below $HOME
/home/smith/Family/School

Incluyendo subdirectorios de $HOME en tu CDPATH, puedes saltar asussubdirectorios de una sola vez:

$ pwd
/etc                                   Anywhere outside your home directory
$ cd School
/home/smith/Family/School              You jumped 2 levels below $HOME

Todos los directorios de tu CDPATH hasta ahora son rutas absolutas en$HOME y sus subdirectorios. Sin embargo, al incluir la ruta relativa.., potencias el nuevo comportamiento de cd en cada directorio. No importa en qué parte del sistema de archivos te encuentres, puedes saltar a cualquier directoriohermano(../sibling) por su nombre sin escribir los dos puntos, porque cd buscará en su padre actual. Por ejemplo, si estás en/usr/bin y quieres ir a /usr/lib, todo lo que necesitas es cd lib:

$ pwd
/usr/bin                              Your current directory
$ ls ..
bin   include   lib   src             Your siblings
$ cd lib
/usr/lib                              You jumped to a sibling

O, si eres un programador que trabaja con código que tiene subdirectoriossrc, include y docs:

$ pwd
/usr/src/myproject
$ ls
docs   include   src

puedes saltar entre los subdirectorios de forma concisa:

$ cd docs                            Change your current directory
$ cd include
/usr/src/myproject/include           You jumped to a sibling
$ cd src
/usr/src/myproject/src               Again

Un CDPATH para el árbol de la Figura 4-1 podría contener seis elementos: tu directorio personal, cuatro de sus subdirectorios y la ruta relativa de un directorio padre:

# Place in a shell configuration file and source it:
export CDPATH=$HOME:$HOME/Work:$HOME/Family:$HOME/Linux:$HOME/Music:..

Después de crear el archivo de configuración, puedes acceder a cd a un gran número de directorios importantes sin tener que escribir largas rutas de directorios, sólo nombres cortos de directorios. ¡Hurra!

Esta técnica funciona mejor si todos los subdirectorios bajo los directoriosCDPATH tienen nombres únicos. Si tienen nombres duplicados, como $HOME/Música y $HOME/Linux/Música, es posible que no obtengas el comportamiento que deseas. El comando cd Music siempre comprobará $HOMEantes que $HOME/Linux y, en consecuencia, no localizará$HOME/Linux/Music mediante la búsqueda.

Para comprobar si hay nombres de subdirectorios duplicados en los dos primeros niveles de$HOME, prueba este descarado one-liner. Enumera todos los subdirectorios y subsubdirectorios de $HOME, aísla los nombres de los subsubdirectorios con cut, ordena la lista y cuenta las apariciones con uniq:

$ cd
$ (ls -d */ && ls -d */*/ | cut -d/ -f2-) | sort | uniq -c | sort -nr | less

Puede que reconozcas esta técnica de comprobación de duplicados de"Detectar archivos duplicados". Si la salida muestra algún recuento superior a 1, tienes duplicados. Me doy cuenta de que este comando incluye algunas funciones que aún no he cubierto. Aprenderás el doble ampersand (&&) en " Técnica nº 1: Listas condicionales"y los paréntesisen "Técnica nº 10: Subconjuntos explícitos".

Volver a los directorios con eficacia

Acabas de ver cómo visitar un directorio de forma eficaz. Ahora te mostraré cómo volver a visitar un directorio rápidamente cuando necesites volver atrás.

Alternar entre dos directorios con "cd -"

Supón que estás trabajando en un directorio profundo y ejecutas cd para ir a otro sitio:

$ pwd
/home/smith/Finances/Bank/Checking/Statements
$ cd /etc

y luego piensa: "No, espera, quiero volver al directorio de Declaracionesdonde acabo de estar". No vuelvas a escribir la ruta larga del directorio. Simplemente ejecuta cd con un guión como argumento:

$ cd -
/home/smith/Finances/Bank/Checking/Statements

Este comando devuelve tu intérprete de comandos a su directorio anterior e imprime su ruta absoluta para que sepas dónde estás.

Para saltar adelante y atrás entre un par de directorios, ejecuta repetidamente cd -. Esto es un ahorro de tiempo cuando estás haciendo trabajo concentrado en dos directorios en un solo intérprete de comandos. Sin embargo, hay un inconveniente: el intérprete de comandos sólo recuerda un directorio anterior cada vez. Por ejemplo, si estás alternando entre /usr/local/bin y /etc:

$ pwd
/usr/local/bin
$ cd /etc                 The shell remembers /usr/local/bin
$ cd -                    The shell remembers /etc
/usr/local/bin
$ cd -                    The shell remembers /usr/local/bin
/etc

y ejecutas cd sin argumentos para saltar a tu directorio personal:

$ cd                      The shell remembers /etc

el intérprete de comandos ha olvidado ahora /usr/local/bin como directorio anterior:

$ cd -                    The shell remembers your home directory
/etc
$ cd -                    The shell remembers /etc
/home/smith

La siguiente técnica supera esta limitación.

Alternar entre varios directorios con pushd y popd

El comando cd - alterna entre dos directorios, pero ¿qué ocurre si tienes que controlar tres o más? Supón que estás creando un sitio web local en tu ordenador Linux. Esta tarea suele implicar cuatro o más directorios:

  • La ubicación de las páginas web activas e implementadas, como /var/www/html

  • El directorio de configuración del servidor web, a menudo /etc/apache2

  • La ubicación de los certificados SSL, a menudo /etc/ssl/certs

  • Tu directorio de trabajo, como ~/Work/Projects/Web/src

Créeme, es tedioso seguir tecleando:

$ cd ~/Work/Projects/Web/src
$ cd /var/www/html
$ cd /etc/apache2
$ cd ~/Work/Projects/Web/src
$ cd /etc/ssl/certs

Si tienes una pantalla grande con ventanas, puedes aliviar la carga abriendo una ventana de shell distinta para cada directorio. Pero si estás trabajando en un único shell (por ejemplo, a través de una conexión SSH ), aprovecha una función del shell llamada pila de directorios. Te permite desplazarte rápidamente entre varios directorios con facilidad, utilizando los comandos de shell incorporados pushd, popd, y dirs. La curva de aprendizaje es de unos 15 minutos, y el enorme beneficio en velocidad dura toda la vida.2

Una pila de directorios es una lista de directorios que has visitado en el shell actual y de los que has decidido hacer un seguimiento. Manipulas la pila realizando dos operaciones llamadas empujar y saltar. Empujar un directorio lo añade al principio de la lista, lo que tradicionalmente se llama la parte superior de la pila. Desplegar elimina el directorio más alto de la pila.3 Inicialmente, la pila sólo contiene tu directorio actual, pero puedes añadir (push) y eliminar (pop) directorios y rápidamente cd entre ellos.

Nota

Cada shell en ejecución mantiene su propia pila de directorios.

Empezaré con las operaciones básicas (empujar, reventar, ver) y luego llegaré a lo bueno.

Introduce un directorio en la pila

El comando pushd (abreviatura de "empujar directorio") hace todo lo siguiente:

  1. Añade un directorio dado a la parte superior de la pila

  2. Realiza un cd a ese directorio

  3. Imprime la pila de arriba abajo para tu referencia

Construiré una pila de directorios de cuatro directorios, introduciéndolos en la pila de uno en uno:

$ pwd
/home/smith/Work/Projects/Web/src
$ pushd /var/www/html
/var/www/html ~/Work/Projects/Web/src
$ pushd /etc/apache2
/etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ pushd /etc/ssl/certs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ pwd
/etc/ssl/certs

El shell imprime la pila después de cada operación pushd. El directorio actual es el directorio situado más a la izquierda (arriba).

Ver una pila de directorios

Imprime la pila de directorios de una shell con el comando dirs . No modifica la pila:

$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src

Si prefieres imprimir la pila de arriba abajo, utiliza la opción -p :

$ dirs -p
/etc/ssl/certs
/etc/apache2
/var/www/html
~/Work/Projects/Web/src

e incluso canalizar la salida al comando nl para numerar las líneas de cero en adelante:

$ dirs -p | nl -v0
     0  /etc/ssl/certs
     1  /etc/apache2
     2  /var/www/html
     3  ~/Work/Projects/Web/src

Aún más sencillo, ejecuta dirs -v para imprimir la pila con líneas numeradas:

$ dirs -v
 0  /etc/ssl/certs
 1  /etc/apache2
 2  /var/www/html
 3  ~/Work/Projects/Web/src

Si prefieres este formato descendente, considera la posibilidad de crear un alias:

# Place in a shell configuration file and source it:
alias dirs='dirs -v'

Hacer saltar un directorio de la pila

El comando popd ("directorio pop") es el inverso de pushd. Hace todo losiguiente:

  1. Elimina un directorio de la parte superior de la pila

  2. Realiza un cd al nuevo directorio superior

  3. Imprime la pila de arriba abajo para tu referencia

Por ejemplo, si tu pila tiene cuatro directorios:

$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src

entonces, si ejecutas repetidamente popd, recorrerás estos directorios de arriba abajo:

$ popd
/etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ popd
/var/www/html ~/Work/Projects/Web/src
$ popd
~/Work/Projects/Web/src
$ popd
bash: popd: directory stack empty
$ pwd
~/Work/Projects/Web/src
Consejo

Los comandos pushd y popd ahorran tanto tiempo que recomiendo crear alias de dos caracteres tan rápidos de escribir como cd:

# Place in a shell configuration file and source it:
alias gd=pushd
alias pd=popd

Intercambiar directorios en la pila

Ahora que ya puedes construir y vaciar la pila de directorios, centrémonos en casos prácticos de uso. pushd sin argumentos intercambia los dos directorios superiores de la pila ynavega hasta el nuevo directorio superior. Saltemos entre /etc/apache2 y tu directorio de trabajo varias veces simplemente ejecutando pushd. Observa cómo el tercer directorio /var/www/htmlpermanece en la pila mientras los dos primeros directorios intercambian posiciones:

$ dirs
/etc/apache2 ~/Work/Projects/Web/src /var/www/html
$ pushd
~/Work/Projects/Web/src /etc/apache2 /var/www/html
$ pushd
/etc/apache2 ~/Work/Projects/Web/src /var/www/html
$ pushd
~/Work/Projects/Web/src /etc/apache2 /var/www/html

Observa que pushd se comporta de forma similar al comando cd -, alternando entre dos directorios, pero no tiene la limitación de recordar sólo un directorio.

Convierte un cd equivocado en un pushd

Supón que estás saltando entre varios directorios con pushd y accidentalmente ejecutas cd en su lugar y pierdes un directorio:

$ dirs
~/Work/Projects/Web/src /var/www/html /etc/apache2
$ cd /etc/ssl/certs
$ dirs
/etc/ssl/certs /var/www/html /etc/apache2

Uy, el comando accidental cd sustituyó ~/Work/Projects/Web/srcen la pila por /etc/ssl/certs. Pero no te preocupes. Puedes volver a añadir el directorio que falta a la pila sin escribir su ruta larga. Sólo tienes que ejecutar pushd dos veces, una con el argumento guión y otra sin él:

$ pushd -
~/Work/Projects/Web/src /etc/ssl/certs /var/www/html /etc/apache2
$ pushd
/etc/ssl/certs ~/Work/Projects/Web/src /var/www/html /etc/apache2

Analicemos por qué funciona:

  • El primer pushd vuelve al directorio anterior de tu shell,~/Trabajo/Proyectos/Web/src, y lo empuja a la pila. pushd, al igual que cd, acepta un guión como argumento para significar "volver a mi directorio anterior".

  • El segundo comando pushd intercambia los dos directorios superiores, devolviéndote a /etc/ssl/certs. El resultado final es que has restaurado~/Trabajo/Proyectos/Web/src a la segunda posición en la pila, exactamente donde habría estado si no hubieras cometido tu error.

Este comando "ups, olvidé un pushd" es lo suficientemente útil como para que merezca un alias. Yo lo llamo slurp porque en mi mente, "sorbe de vuelta" un directorio que perdí por error:

# Place in a shell configuration file and source it:
alias slurp='pushd - && pushd'

Profundiza en la pila

¿Y si quieres cd entre directorios de la pila distintos de los dos primeros? pushd y popd aceptan un argumento entero positivo o negativo para operar más adentro en la pila. El comando

$ pushd +N

desplaza N los directorios de la parte superior de la pila a la parte inferior y, a continuación, realiza un cd al nuevo directorio superior. Un argumento negativo (-N) desplaza los directorios en sentido contrario, de abajo a arriba, antes de realizar el cd.4

$ dirs
/etc/ssl/certs ~/Work/Projects/Web/src /var/www/html /etc/apache2
$ pushd +1
~/Work/Projects/Web/src /var/www/html /etc/apache2 /etc/ssl/certs
$ pushd +2
/etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src /var/www/html

De esta forma, puedes saltar a cualquier otro directorio de la pila con un simple comando. Sin embargo, si tu pila es larga, puede resultar difícil juzgar a simple vista la posición numérica de un directorio. Entonces, imprime la posición numérica de cada directorio con dirs -v, como hiciste en"Visualizar una pila de directorios":

$ dirs -v
 0  /etc/apache2
 1  /etc/ssl/certs
 2  ~/Work/Projects/Web/src
 3  /var/www/html

Para desplazar /var/www/html a la parte superior de la pila (y convertirlo en tu directorio actual), ejecuta pushd +3.

Para saltar al directorio situado en la parte inferior de la pila, ejecuta pushd -0(guión cero):

$ dirs
/etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src /var/www/html
$ pushd -0
/var/www/html /etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src

También puedes eliminar directorios de la pila más allá del directorio superior, utilizando popd con un argumento numérico. El comando:

$ popd +N

elimina el directorio en la posición N de la pila, contando hacia abajo desde la parte superior. Un argumento negativo (-N) cuenta hacia arriba desde la parte inferior de la pila. La cuenta empieza en cero, por lo que popd +1elimina el segundo directorio desde arriba:

$ dirs
/var/www/html /etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src
$ popd +1
/var/www/html /etc/ssl/certs ~/Work/Projects/Web/src
$ popd +2
/var/www/html /etc/ssl/certs

Resumen

Todas las técnicas de este capítulo son fáciles de comprender con un poco de práctica y te ahorrarán mucho tiempo y mecanografía. Las técnicas que me han cambiado especialmente la vida son:

  • CDPATH para una navegación rápida

  • pushd y popd para rendimientos rápidos

  • El comando ocasional cd -

1 Me lo he inventado, pero seguro que es verdad.

2 Una alternativa es abrir varias pantallas virtuales utilizando programas de línea de comandos como screen y tmux, que se llaman multiplexores de terminal. Son más difíciles de aprender que las pilas de directorios, pero merece la pena echarles un vistazo.

3 Si conoces las pilas de informática, una pila de directorios es precisamente una pila de nombres de directorio.

4 Los programadores pueden reconocer estas operaciones como girar la pila.

Get Linux eficiente en la línea de comandos now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.