Estou um pouco inseguro quanto ao que você quer realmente, mas interpreto sua pergunta como querendo um 'one-liner' que captura uma lista de diretórios em $HOME
, por exemplo, e então permite que você grave para o primeiro ou segundo diretório nessa lista, ou qualquer um deles para esse assunto.
Isso eu acho possível se você colocar todos os diretórios em um array e então você pode cd para qualquer diretório nesse array, usando, por exemplo, cd "${cdarray[1]}"
, o que realmente levaria você para o diretório segundo na lista, porque as matrizes Bash sempre começam em 0, portanto, o índice 0 na matriz é, na verdade, o primeiro diretório.
Aqui está o one-liner que eu criei e que você pode usar; modificá-lo para atender às suas finalidades. Eu excluo diretórios da lista que são, na verdade, links simbólicos ( [[ ! -L "$d" ]]
). Você pode remover este teste se precisar incluí-lo e apenas manter o teste para o diretório.
Este é um exemplo para o diretório $HOME
e eu adicionei $HOME
ao comando, então os caminhos agora são absolutos, então você poderá executar cd "${cdarray[1]}"
posteriormente como um comando separado de qualquer local e vai funcionar. Se você criá-lo para outro diretório, basta especificar o caminho absoluto em vez de $HOME
no comando abaixo, a menos que você queira que ele funcione apenas em relação ao diretório no qual ele foi criado.
cdarray=(); for d in *; do [[ ! -L "$HOME/$d" && -d "$HOME/$d" ]] && cdarray+=("$HOME/$d"); done; cd "${cdarray[1]}"
Agora, todos os diretórios com espaços em seus nomes serão manipulados com êxito.
A matriz indexada é declarada e, em seguida, se o item encontrado for um diretório e não um link simbólico, ele será adicionado à matriz e, após o ponto-e-vírgula, seremos enviados para o diretório desejado, por exemplo, cd "${cdarray[1]}"
.
Você poderia adicionar || exit 1
no final se você usasse isso em um script, mas eu não adicionei isso acima, pois ele fecharia o terminal interativo se o comando cd falhasse.