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.