Existe uma maneira em um shell unix (especificamente Ubuntu) de alterar o diretório para o x-ésimo diretório que foi impresso no comando ls? Eu sei que você pode classificar um diretório de várias maneiras, mas usando a saída de ls para obter o x-ésimo diretório?
Um exemplo de shell:
$ ls
$ first_dir second_dir third_really_long_and_complex_dir
onde desejo passar para o third_really_long_and_complex_dir passando 3 (ou 2 no formato de array adequado). Eu sei que poderia simplesmente copiar e colar, mas se já estiver usando o teclado, seria mais fácil digitar algo como "cdls 2" ou algo parecido se eu conhecesse o índice.
ATUALIZAR
Para quem ainda está vendo isso, criei essa pergunta quando era realmente novo no Linux/bash e não percebi que existia o preenchimento de guias.
Responder1
O principal problema cd
em uma sessão interativa é que geralmente você deseja alterar o diretório atual do shell que está processando o prompt de comando. Isso significa que lançar um sub-shell (por exemplo, um script) não ajudaria, já que qualquer cd
chamada não afetaria o shell pai.
Dependendo de qual shell você está usando, no entanto, você poderá definir umfunçãopara fazer isso. Por exemplo no bash:
function cdls() {
# Save the current state of the nullglob option
SHOPT=`shopt -p nullglob`
# Make sure that */ expands to nothing when no directories are present
shopt -s nullglob
# Get a list of directories
DIRS=(*/)
# Restore the nullblob option state
$SHOPT
# cd using a zero-based index
cd "${DIRS[$1]}"
}
Observe que neste exemplo me recuso absolutamente a analisar a saída de ls
,por uma série de razões. Em vez disso, deixei o próprio shell recuperar uma lista de diretórios (ou links para diretórios)...
Dito isto, suspeito que usar esta função (ou qualquer coisa nesse sentido) seja uma boa maneira de se preparar para uma enorme bagunça - como usar rm
depois de mudar para o diretório errado. O preenchimento automático do nome do arquivo já é bastante perigoso, sem se forçar acontar...
Responder2
Eu tenho uma função para isso:
função CDI. { SE=$'\n' PÁGINA=${1:-1} LPP=${2:-11} primeiro=$(( 1 + LPP * PÁGINA - LPP )) último=$((LPP * PÁGINA)) selecione cd_into em $(find. -maxprofundidade 1 -type d -printf "%P\n" |\ sed -n $primeiro,${último}p); fazer SAIR=-1; se [[ $RESPONDER == n ]]; então deixe PAGE=PAGE+1; CDI. $PAGE $LPP ; SAIR=$? elif [[ $REPLY == p ]]; então deixe PAGE=PAGE-1; CDI. $PAGE $LPP ; SAIR=$? elif [[ $REPLY == m ]]; então deixe LPP=LPP*2; CDI. $PAGE $LPP ; SAIR=$? elif [[ $REPLY == l ]]; então deixe LPP=LPP/2; CDI. $PAGE $LPP ; SAIR=$? elif [[ $RESPOSTA == q || $REPLY == 0 ]];então retorne 0; fi se [$EXIT -eq 0]; então retorne 0; fi cd_into=${cd_into//\~/$HOME} se [ -d "$cd_into" ];então CD "$cd_into"; retornar 0; outro echo "ops! \`$cd_into' não é uma pasta (?)" fi feito desativar IFS }
Usar:
$cdi. 1) .mozilla.new 3) .swt 5) tmp 7) .vim 9) .ssh 2) .crack-attack 4) Downloads 6) .Eterm 8) .frozen-bubble 10) .irssi Qual #?: