cd - más en la historia

cd - más en la historia

¿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).

  1. ~/
  2. ~/otrodirectorio
  3. ~/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 DIRSTACKen 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 dirscomando nos permite recuperar un enésimo elemento de la pila. Usando esa salida como argumento cdpodemos 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 cdllamada pushdcon 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

cshtiene su propia implementación de pila de directorios, pero kshno 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 3subir 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 staty luego usamos la combinación de findycd

$> 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 findrecorre 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/longincluso 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

información relacionada