¿Cómo podría usar algo similar a cd -
, que va al directorio anterior en el historial, para retroceder aún más en el historial del directorio? Por ejemplo, digamos que mi historial es: (siendo 1 actual).
- ~/
- ~/otrodirectorio
- ~/realmente/largo/directorio/nombre/que/yo/no/quiero/escribir/otra vez/pero/no/usa/suficiente/para/hacer/un/alias/para
Usar cd -
aquí me llevaría al n. ~/otherDirectory
° 2, y si lo uso nuevamente, me llevará de regreso al ~/
n.° 1 (en el que no quiero estar) en lugar del directorio realmente largo n.° 3 (en el que sí quiero estar). ). En resumen, ¿cómo puedo navegar más atrás en el historial del directorio? ¿Hay algún bash que pueda escribir para agregar esta funcionalidad?
Estoy intentando retroceder en el historial del directorio (más de un solo directorio), de forma muy parecida a como se haría en el historial de comandos usando la flecha hacia arriba. Esperemos que esto aclare que esta pregunta no se ha hecho antes.
Respuesta1
Pila de directorios en Bash
Hay algo que se conoce como pila de directorios o DIRSTACK
en bash. Stack es una estructura de datos básica en informática, donde puedes almacenar elementos uno encima del otro (como una pila de libros), pero acceder solo al más reciente (arriba).
Aquí hay una pequeña demostración: cada vez que inserto algo en la pila de directorios, mi directorio de trabajo actual se configura en ese elemento; cada vez que aparece, eliminamos el elemento superior (más a la izquierda) de la pila y volvemos al siguiente elemento disponible:
$> # pushd navigates to and stores the directory given
$> pwd
/home/xieerqi
$> pushd bin
~/bin ~
$> pushd /etc
/etc ~/bin ~
$> # popd deletes leftmost item, returns to next directory on left$> pwd
/etc
$> popd
~/bin ~
$> pwd
/home/xieerqi/bin
$>
El elemento más reciente siempre se almacena en la parte superior de la pila, incluso cuando usacd
$> dirs
/ /etc ~
$> cd /var
$> dirs
/var /etc ~
$>
El dirs
comando nos permite recuperar un enésimo elemento de la pila. Usando esa salida como argumento cd
podemos navegar a cualquier directorio que esté en la pila, sin afectar la pila misma. Observe a continuación cómo /etc/
y ~
(elementos de la pila 1 y 2) permanecen iguales, aunque cambie mi directorio de trabajo actual (y también el elemento superior)
$> dirs
/var /etc ~
$> dirs +1
/etc
$> cd $(dirs +1)
$> pwd
/etc
$> dirs
/etc /etc ~
Uso del comportamiento DIRSTACK para simular el comportamiento del navegador web
¿Sabes que en un navegador web, si saltas de la URL A a la URL B y a la URL C, puedes ir y venir entre ellas usando las teclas de flecha hacia adelante y hacia atrás?
Bueno, podemos hacer lo mismo en bash con estas dos funciones:
cd()
{
if [ $# -eq 0 ]; then
pushd "$HOME" > /dev/null
else
pushd "$@" > /dev/null
fi
}
cdback()
{
popd > /dev/null
printf "Returned to:%s\n" "$( dirs +0)"
}
Las funciones tienen prioridad sobre los alias, por lo que podemos usar eso para nuestro beneficio y realizar cada cd
llamada pushd
con cada argumento que se proporciona (y si no se proporciona ninguno, volvemos al directorio de inicio, el mismo comportamiento, pero se registra)
$> pwd
/home/xieerqi
$> cd /etc
$> cd /var
$> cd /usr
$> pwd
/usr
$> cdback
Returned to:/var
$> pwd
/var
$> cd
$> pwd
/home/xieerqi
Pila de directorios en otros shells
csh
tiene su propia implementación de pila de directorios, pero ksh
no la tiene. Podrías usar La implementación de Eddie
Subiendo con un bucle for
En cuanto a subir una cierta cantidad de directorios, podría escribir una función que llame a cd ..
una cierta cantidad de veces. Por ejemplo, aquí está mi función personalizada en.bashrc
function goUp # go up x number of dirs
{
num=$1
while [ num -ne 0 ];do
cd ..
num=$( expr $num - 1 )
done
}
# ---
Entonces llamaría a esto para goUp 3
subir 3 directorios y llamaría cd ..
3 veces.
Usando el número de inodo
Este método es bueno cuando Este truco se usa a menudo cuando el nombre de la carpeta tiene un carácter difícil o irreconocible. Encontramos el número de inodo del directorio al que desea ir stat
y luego usamos la combinación de find
ycd
$> stat $HOME/bin/sh/
File: ‘/home/xieerqi/bin/sh/’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 5795531 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ xieerqi) Gid: ( 1000/ xieerqi)
Access: 2015-08-19 15:27:38.280529273 -0600
Modify: 2016-02-20 17:03:49.822700405 -0700
Change: 2016-02-20 17:03:49.822700405 -0700
Birth: -
$> cd $(find $HOME -inum 5795531 -type d 2>/dev/null)
$> pwd
/home/xieerqi/bin/sh
Por supuesto, esto puede resultar un poco lento, porque find
recorre todo el árbol de directorios de forma recursiva.
Respuesta2
Si estás en ~/really/long/directory/name y quieres estar solo en ~/really/long, puedes usarlo cd ~/really/long
incluso si estás en un subdirectorio de 'long'
Si acabas de irte ~/really/long y quieres volver allí, puedes hacerlo
Cd
Y luego use la flecha hacia arriba para recorrer su historial de comandos hasta donde usó
Cd ~/really/long