Isso funcionará apenas nos diretórios e permanecerá no mesmo diretório, se nenhum for encontrado:
cdg () {
cd $(ls -d */ | grep "$1" || echo .)
}
Se mais de um diretório corresponder, ele será alterado para o primeiro da lista.
Eu deveria mudar o diretório para "foo" quando ele estiver disponível. Como fazer isso? Até aqui eu cheguei:
cd 'ls | grep foo'
Mas o problema é que, se não houver correspondência para o grep, o diretório será alterado para o diretório inicial.
Outra abordagem que eu usei foi:
ls -1 | grep foo | xargs -r cd
Neste exemplo, -r cuida de não executar o comando se não houver correspondência. Mas isso não funciona, já que o comando cd é o shell build-in e não um executável. Ou algo assim ..
[edit] Obrigado por respostas. Se possível, você poderia também dizer como combinar a funcionalidade mencionada em torno do grep de alguma forma, para que eu pudesse usar o regexp avançado?
Que tal tentar isso?
test -d foo && cd foo
Você pode colocar isso como uma função no seu .bashrc ou algo assim:
# conditional cd, use as follows:
# ccd some_dir
function ccd {
test -d "$1" && cd "$1"
}
Para usar o grep ao invés de um simples teste -d, use o seguinte (note que você pode usar outro grep ou adicionar flags como quiser):
# conditional regex-cd
functino rccd {
if has_dir='ls |egrep "$1"'; then cd $has_dir; fi
}
// Editado para corresponder à pergunta atualizada.
if [[ -d foo ]]; then
cd foo
fi
-d
significa que "o arquivo existe e é um diretório". Isso está na seção "EXPRESSÕES CONDICIONAIS" do homem bash.
Tags bash