cd - mais na história [duplicado]

1

Como eu poderia usar algo semelhante a cd - , que vai para o diretório anterior do histórico, para voltar ainda mais no histórico de diretórios? Por exemplo, digamos que minha história é: (1 sendo atual).

  1. ~ /
  2. ~ / otherDirectory
  3. ~ / realmente / long / diretório / nome / que / i / não / deseja / para / digite / novamente / mas / não / use / suficiente / para / make / an / alias / para

Usar cd - aqui me traria para ~/otherDirectory # 2, e se eu usá-lo novamente, ele me levará de volta a ~/ # 1 (que eu não quero estar) em vez de realmente diretório longo # 3 (que eu quero estar em). Em resumo, como navego novamente para o histórico de diretórios? Existe alguma festa que eu poderia escrever para adicionar essa funcionalidade?

Estou tentando voltar pelo histórico de diretórios (mais do que apenas um diretório), da mesma forma que um passaria pelo histórico de comandos usando a seta para cima. Espero que isso esclarece que esta pergunta não foi feita antes.

    
por Jason Basanese 25.02.2016 / 23:14

2 respostas

3

Pilha de diretórios no Bash

Existe algo conhecido como pilha de diretórios ou DIRSTACK no bash. Stack é uma estrutura de dados básica em ciência da computação, na qual você pode armazenar elementos uns em cima dos outros (como uma pilha de livros), mas acessa apenas um mais recente (topo).

Aqui está uma pequena demonstração - cada vez que eu empurrar algo para a pilha de diretórios, meu diretório de trabalho atual é configurado para aquele item; toda vez que eu faço pop - excluímos o item superior (à esquerda) da pilha e retornamos ao próximo item disponível:

$>  # 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
$> 

O item mais recente é sempre armazenado como o topo da pilha, mesmo quando você usa cd

$> dirs
/ /etc ~
$> cd /var
$> dirs
/var /etc ~
$> 

O comando dirs nos permite recuperar um enésimo elemento da pilha. Usando essa saída como argumento para cd , podemos navegar para qualquer diretório que esteja na pilha, sem afetar a própria pilha. Observe abaixo como /etc/ e ~ (elementos de pilha 1 e 2) permanecem os mesmos, mesmo que eu mude meu diretório de trabalho atual (e também o elemento de cima)

$> dirs
/var /etc ~
$> dirs +1
/etc
$> cd $(dirs +1)
$> pwd
/etc
$> dirs
/etc /etc ~

Usando o comportamento de DIRSTACK para simular o comportamento do navegador da Web

Você sabe como em um navegador da Web, se você pular do URL A para o URL B e para o URL C, pode alternar entre eles usando as teclas de seta para trás e para a frente?

Bem, podemos fazer o mesmo no bash com estas duas funções:

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)"

}

As funções têm precedência sobre aliases, portanto, podemos usar isso a nosso favor e fazer com que cada cd chame pushd em cada argumento que é dado (e se nenhum for dado, voltaremos para o diretório home, mesmo comportamento , mas está gravado)

$> pwd
/home/xieerqi
$> cd /etc
$> cd /var
$> cd /usr
$> pwd
/usr
$> cdback
Returned to:/var
$> pwd
/var
$> cd
$> pwd
/home/xieerqi

Pilha de diretórios em outros shells

csh tem sua própria implementação de pilha de diretórios, mas ksh não. Você pode usar a implementação do Eddie

Indo para um loop for

Quanto a um certo número de dirs, você poderia escrever uma função que chama cd .. determinado número de vezes. Por exemplo, aqui está minha função personalizada em .bashrc

function goUp # go up x number of dirs
{
  num=
  while [ num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}
# ---

Então, eu chamaria isso de goUp 3 para ir até três diretórios e chamaria cd .. 3 vezes

Usando o número de inode Este método é bom quando Esse truque costuma ser usado quando o nome da pasta tem caractere difícil / irreconhecível. Encontramos o número de inode do diretório para o qual você deseja ir usando stat e, em seguida, usamos a combinação de find e cd

$> 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

Claro que isso pode ser um pouco lento, porque find percorre toda a árvore de diretórios recursivamente.

    
por Sergiy Kolodyazhnyy 25.02.2016 / 23:33
0

Se você está cd'd em ~ / really / long / directory / name, e você quer estar em apenas ~ / realmente / long, você pode usar cd ~/really/long mesmo se você estiver em um subdiretório de ' longo '

Se você acabou de sair ~ / really / long e deseja voltar para lá, basta fazer

Cd

E, em seguida, use a seta para cima para acessar o histórico de comandos até o local em que você usou

Cd ~/really/long
    
por Gabriel Ruoff 25.02.2016 / 23:36