Altere para xth terminal de diretórios

0

Existe uma maneira em um shell unix (especificamente Ubuntu) para alterar o diretório para o xth diretório que foi impresso a partir do 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 xth diretório?

Um exemplo de shell:

$ ls
$ first_dir second_dir third_really_long_and_complex_dir

onde eu quero passar para o third_really_long_and_complex_dir passando 3 (ou 2 no formato de matriz apropriado). Eu sei que poderia simplesmente copiar e colar, mas se eu já estivesse usando o teclado, seria mais fácil digitar algo como "cdls 2" ou algo assim se eu soubesse o índice.

UPDATE

Para quem ainda vê isso, criei essa pergunta quando eu era novo no linux / bash e não sabia que havia algo como conclusão de tabulação.

    
por Benjamin Kaiser 09.11.2012 / 16:37

2 respostas

0

O principal problema com 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 o lançamento de um sub-shell (por exemplo, um script) não ajudaria, já que qualquer cd de chamadas não afetaria o shell pai.

Dependendo do shell que você está usando, no entanto, você pode definir uma função para 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]}"
}

Note que neste exemplo eu absolutamente me recuso a analisar a saída de ls , por várias razões . Em vez disso, deixo o próprio shell recuperar uma lista de diretórios (ou links para diretórios) ...

Dito isso, suspeito que o uso dessa função (ou qualquer coisa nesse sentido) seja uma ótima maneira de se preparar para uma enorme bagunça - como usar rm depois de mudar para o diretório errado. O preenchimento automático de nomes de arquivos já é perigoso o suficiente, sem forçar você a contar ...

    
por 09.11.2012 / 17:12
1

Eu tenho uma função para isso:

   function cdi. {
       IFS=$'\n'
       PAGE=${1:-1}
       LPP=${2:-11}
       first=$(( 1 + LPP * PAGE - LPP ))
       last=$(( LPP * PAGE ))
       select cd_into in $(find . -maxdepth 1 -type d -printf "%P\n" |\
             sed -n $first,${last}p);
       do
           EXIT=-1;
           if [[ $REPLY == n ]]; then let PAGE=PAGE+1; cdi. $PAGE $LPP ; EXIT=$?
         elif [[ $REPLY == p ]]; then let PAGE=PAGE-1; cdi. $PAGE $LPP ; EXIT=$?
         elif [[ $REPLY == m ]]; then let LPP=LPP*2;   cdi. $PAGE $LPP ; EXIT=$?
         elif [[ $REPLY == l ]]; then let LPP=LPP/2;   cdi. $PAGE $LPP ; EXIT=$?
         elif [[ $REPLY == q || $REPLY == 0 ]];then return 0; fi

           if [ $EXIT -eq 0 ]; then return 0; fi

           cd_into=${cd_into//\~/$HOME}
           if [ -d "$cd_into" ];then
               cd "$cd_into"; return 0; else
               echo "oops! \'$cd_into' is not a folder (?)"
           fi
       done
       unset IFS
   }

Para 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
Which #?:
    
por 06.12.2012 / 19:42