lunes, 17 de diciembre de 2007

Cómo desplazarse por la consola como un experto

Hay situaciones en las que el uso de cd para moverse entre los directorios del sistema se puede hacer bastante pesado, incluso con el autocompletado en bash.

Se han propuesto multitud de soluciones a este problema: el uso de CDPATH, la creación de alias para los directorios más utilizados, los comandos pushd, popd y dirs; CDargs, etc.

cd como un experto

Empecemos por lo más sencillo y veamos que cd es un poco más complejo de lo que parece. Mucha gente sabe del autocompletado de bash, gracias al cual basta con escribir parte del nombre del directorio y pulsar Tab para que la consola complete el directorio (si no hay varias posibilidades, en caso contrario tendríamos que pulsar dos veces Tab para verlas). También es muy común el uso de rutas relativas: si estamos en /home/zootropo y queremos desplazarnos a /home/zootropo/videos no es necesario escribir la segunda ruta en su totalidad, sino que podemos escribir simplemente cd videos. Incluso es normal ver a novatos usando atajos como cd .. para desplazarse al directorio superior y cd ~ o cd para desplazarse al directorio de usuario.

Lo que es menos común, y muy útil para el tema que nos ocupa es el uso de cd -. Este flag tan útil no hace otra cosa que movernos al último directorio en el que estuvimos.

zootropo@genua:~$ cd /etc/X11/
zootropo@genua:/etc/X11$ cd
zootropo@genua:~$ cd -
/etc/X11
zootropo@genua:/etc/X11$ pwd
/etc/X11

De esta forma podemos movernos entre dos directorios rápidamente.

Por otro lado, si lo que necesitamos es desplazarnos a un directorio tan solo un momento para ejecutar un comando y luego seguir trabajando en el directorio actual, también podríamos usar &&, que ejecuta dos comandos, uno detrás de otro, de forma condicional (and con cortocircuito):

cd /etc/X11/ && cat xorg.conf

y rodearlo con paréntesis, que hace que los comandos se ejecuten en una subshell

(cd /etc/X11/ && cat xorg.conf)

de esta forma se ejecutará el comando en una subshell distinta, por lo que el cd no nos afectará, y será como si nunca nos hubiéramos desplazado.

Pero, ¿qué ocurre si queremos movernos entre varios directorios? ¿qué podemos hacer si queremos desplazarnos, por ejemplo, al penúltimo directorio que visitamos? la combinación pushd, popd y dirs, nos proporciona una alternativa válida.

pushd, popd y dirs

pushd funciona como un cd normal, moviéndonos al directorio especificado, pero además, como su nombre indica, introduce dicho directorio en una pila.

pushd /etc/X11/

popd también funciona como un cd, pero el directorio al que nos mueve es el que extrae de la pila, y dado que la pila es una estructura LIFO (Last In, First Out o lo que es lo mismo, el último en introducirse es el primero en extraerse) al escribir este comando nos moveremos al último directorio añadido a la pila.

popd

También es posible indicar qué elemento de la pila queremos utilizar mediante un índice. Por ejemplo:

popd +2

extraería el tercer elemento (el índice del primer elemento es 0). También podemos utilizar índices negativos, como -2, contando al revés.

Por último dirs nos sirve para imprimir el contenido de la pila:

zootropo@genua:/etc/X11$ dirs
/etc/X11 ~

Al comando dirs también se le puede pasar un índice para imprimir tan solo el directorio seleccionado por el índice.

La desventaja del uso de pushd y popd es que cada vez que hacemos un popd el directorio se borra de la pila, y si quisiéramos volver a utilizarlo tendríamos que volver a guardarlo en la pila, lo cual va en contra de la rapidez que buscamos y que nos impulsó a usarlos en primer lugar.

Existe una alternativa que consiste en aprovecharnos de la característica de la indexación de dirs. El comando

dirs +0

mostraría el primer elemento de la pila.

Basta con usar este directorio como argumento para cd para poder movernos a los directorios almacenados sin que se borren de la pila:

cd `dirs +0`

Sin embargo, por alguna extraña razón, cuando el directorio que seleccionamos con dirs es el directorio home, que se almacena como ~, este pequeño truco no funciona, sino que tendríamos que usar el flag -l para que dirs muestre la ruta completa del directorio home en lugar de ~.

cd `dirs -l +0`

Podríamos ahorrarnos tener que escribir el flag -l con un alias, e incluso crear alias como

alias cd="pushd"
alias cd1="cd `dirs -l +1`"

de forma que al escribir cd1 nos desplazáramos al penúltimo directorio introducido con nuestro cd-pushd.

Sin embargo, hay alternativas más sencillas, como CDargs.

CDargs

CDargs se encuentra en los repositorios de Ubuntu, así que instalarlo en esta distro es tan sencillo como escribir:

sudo aptitude install cdargs

También es conveniente añadir las funciones para bash ya creadas que vienen con la aplicación editando el .bashrc:

gedit ~/.bashrc

y añadiendo la siguiente línea, que hace un source del archivo correspondiente (asegúrate de que el archivo se instaló en esa ruta y modifica la línea adecuadamente si no es así)

source /usr/share/doc/cdargs/examples/cdargs-bash.sh

Reinicia la consola y podemos empezar a jugar.

Si escribimos el comando

cv

en la consola, se lanzará la interfaz gráfica en ncurses de CDargs, un pequeño explorador de archivos en modo consola.


Primero seleccionamos el directorio que nos interesa con las flechas de arriba y abajo, con Avance página y Retroceso de página, con Inicio y Fin o pulsando el número asociado. Si solo queremos hacer un cd a ese directorio, pulsamos enter. Si queremos hacer un cd a un directorio que está contenido dentro del directorio seleccionado, pulsamos la flecha derecha para que CDargs muestre su contenido, y por último, si queremos movernos a un directorio superior, pulsamos la flecha izquierda. Para salir de la interfaz sin hacer nada, pulsamos la tecla 'q'. Si queremos ver archivos ocultos, pulsamos la tecla '.'.

CDargs también incluye un sistema de marcadores. Para utilizarlo nos desplazaremos al directorio que queramos añadir a nuestros favoritos y escribimos

ca etiqueta

Por ejemplo:

cd /home/zootropo/videos
ca vid

Después basta escribir

cv etiqueta

para desplazarnos al directorio que guardamos en marcadores con dicha etiqueta.

Podemos ver los marcadores que hemos creado desde la interfaz gráfica de CDargs, pulsando la tecla Tab para cambiar entre el modo de marcadores y el modo explorador.

Por último, quizás os interese echar un vistazo a los gestores de archivo de modo consola, como GNU Midnight Commander

sudo aptitude install mc

No hay comentarios: