Alterando o caminho condicionalmente no bash

1

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?

    
por user40167 03.08.2010 / 07:46

3 respostas

1

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.

    
por 03.08.2010 / 16:08
3

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.

    
por 03.08.2010 / 08:32
2
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.

    
por 03.08.2010 / 07:56

Tags