cd - mais adiante na história

cd - mais adiante na história

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

  1. ~/
  2. ~/outroDiretório
  3. ~/realmente/longo/diretório/nome/que/eu/não/quero/digitar/de novo/mas/não/use/suficiente/para/fazer/um/alias/para

Usar cd -aqui me levaria ao ~/otherDirectory# 2, e se eu usá-lo novamente, ele me levaria de volta ao ~/# 1 (no qual não quero estar) em vez do diretório realmente longo # 3 (no qual eu quero estar) ). Em resumo, como navego mais para trás no histórico do diretório? Existe algum bash que eu possa escrever para adicionar essa funcionalidade?

Estou tentando voltar ao histórico do diretório (mais do que apenas um diretório), da mesma forma que alguém percorreria o histórico de comandos usando a seta para cima. Esperamos que isso esclareça que esta pergunta não foi feita antes.

Responder1

Pilha de diretório no Bash

Existe algo conhecido como pilha de diretórios ou DIRSTACKno bash. Stack é uma estrutura de dados básica em ciência da computação, onde você pode armazenar elementos uns sobre os outros (como uma pilha de livros), mas acessar apenas os mais recentes (topo).

Aqui está uma pequena demonstração - cada vez que coloco algo na pilha de diretórios, meu diretório de trabalho atual é definido para esse item; toda vez que eu apareço - excluímos o item superior (mais à 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 no topo da pilha, mesmo quando você usacd

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

O dirscomando nos permite recuperar um enésimo elemento da pilha. Usando essa saída como argumento, cdpodemos 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 o elemento superior também)

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

Usando o comportamento 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 o URL C, poderá alternar entre eles usando as teclas de seta para frente e para trás?

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 os aliases, portanto, podemos usar isso a nosso favor e fazer cada cdchamada pushdem cada argumento fornecido (e se nenhum for fornecido, voltamos ao diretório inicial, mesmo comportamento, mas está registrado)

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

cshtem sua própria implementação de pilha de diretórios, mas kshnão tem. Você poderia usar Implementação de Eddie

Subindo com um loop for

Quanto a subir um certo número de diretórios, você pode escrever uma função que chame cd ..um certo número de vezes. Por exemplo, aqui está minha função personalizada em.bashrc

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

Então eu chamaria isso de goUp 3subir 3 diretórios, e ele chamaria cd ..3 vezes

Usando o número do inode Este método é bom quando Este truque é frequentemente usado quando o nome da pasta tem caracteres difíceis/caracteres irreconhecíveis. Encontramos o número do inode do diretório que você deseja usar state, em seguida, usamos a combinação de findecd

$> 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 findpercorre toda a árvore de diretórios recursivamente.

Responder2

Se você fez o cd em ~/really/long/directory/name e deseja estar em apenas ~/really/long, você pode usar cd ~/really/longmesmo se estiver em um subdiretório de 'long'

Se você acabou de sair ~/realmente/long e quer voltar para lá, você pode simplesmente fazer

Cd

E então use a seta para cima para percorrer seu histórico de comandos até onde você usou

Cd ~/really/long

informação relacionada