Uma vez eu fiz um script útil para um propósito similar, com uma função fcd para find-n-cd.
Você digita fcd foo
e 3 coisas podem acontecer:
- Nenhum diretório foo é encontrado, então ele retorna com
"no such directory " $1
- Um arquivo é encontrado: Ele testa se é um diretório (ou apenas um arquivo) e, nesse caso, cds lá.
- Vários arquivos são encontrados - então, uma seleção é apresentada, onde você apenas digita o número da seleção (ou um número especial para devolução).
É semelhante em que não precisa de você para digitar o caminho inteiro, mas você chama a função explicitamente.
#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd ()
{
list=$(locate $1 | egrep "/$1$")
count=$(echo $list | wc -w )
case $count in
0)
echo "unknown directory: "$1 && return
# could search for partial matches Doc => Documentation
;;
1)
if [[ -d "$list" ]]; then
echo "$list";
cd "$list";
else
echo "not a directory: $1"
fi
;;
*)
select directory in $list "/exit/"
do
if [[ "$directory" = "/exit/" ]]; then break; fi
if [[ -d "$directory" ]]; then
echo "$directory";
cd "$directory";
break
else
echo "not a directory: "$1
fi
done
;;
esac
}
Você tem que source
da função ( source fcd.sh
| . fcd.sh
) e não pode chamá-la como script, porque cd
só aconteceria no contexto do script, e depois de terminar você aconteceria estar de volta ao seu diretório inicial imediatamente.
Como funciona com locate
, é muito rápido encontrar diretórios (mas nem sempre atualizados).
Ele não manipula espaços em branco em nomes de diretório normalmente. Se você tiver uma solução elegante para o problema, eu ficaria feliz.