Você não pode usar e alias para esse problema, porque um alias não pode receber argumentos no meio, apenas no final. Você precisa de uma função para isso.
A seguinte função faz o que você está pedindo:
cdd() {
cd 'find . -type d -name "$1"|head -n1'
}
Você terá que adicionar estas linhas ao seu arquivo .profile (ou arquivo .bashrc), para que ele seja executado (uma vez) quando você efetuar login.
Para testes, você pode colocá-lo em um arquivo, por exemplo chamado func.sh
e, em seguida, fonte-lo (ou seja, executá-lo usando o operador ".") para que ele se torne parte do seu ambiente:
. ./func.sh
Nota: Se você fizer alterações no arquivo func.sh
, precisará fazer o mesmo novamente.
Você pode usá-lo como:
cdd <dirname>
A função, como é agora, irá procurar por um diretório com o nome <dirname>
no caminho atual e abaixo e irá cd
para a primeira ocorrência que encontrar ( head -n1
).
Você pode ajustar a operação find
para obter o resultado desejado primeiro. Veja man find
.
Para encontrar a correspondência mais próxima, você pode classificar a saída da localização para fornecer a linha mais curta:
find . -type d -name "$1"| awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2- | head -n1
(O comando awk
foi roubado de aqui .)
Isso retornará a linha mais curta na saída do find. No entanto, ele retornará o diretório errado se, por exemplo, você estiver procurando pelo diretório proj
e tiver uma estrutura como esta:
./d1/d2/d3/proj
./longdirname/proj
Como alternativa, você pode contar o número de caracteres /
no resultado para contornar isso.