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).
- ~/
- ~/outroDiretório
- ~/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 DIRSTACK
no 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 dirs
comando nos permite recuperar um enésimo elemento da pilha. Usando essa saída como argumento, 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 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 cd
chamada pushd
em 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
csh
tem sua própria implementação de pilha de diretórios, mas ksh
nã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 3
subir 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 stat
e, em seguida, usamos a combinação de find
ecd
$> 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.
Responder2
Se você fez o cd em ~/really/long/directory/name e deseja estar em apenas ~/really/long, você pode usar cd ~/really/long
mesmo 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