Есть ли способ в оболочке Unix (в частности, Ubuntu), чтобы изменить каталог в каталог xth, который был напечатан из команды ls? Я знаю, что вы можете сортировать каталог несколькими способами, но используя вывод ls для получения каталога xth?

Пример оболочки:

$ ls
$ first_dir second_dir third_really_long_and_complex_dir

где я хочу перейти в third_really_long_and_complex_dir, передав 3 (или 2 в правильном формате массива). Я знаю, что могу просто скопировать и вставить, но если я уже использую клавиатуру, было бы легче напечатать что-то вроде "cdls 2" или что-то подобное, если бы я знал индекс.

ОБНОВИТЬ

Для тех, кто все еще видел это, я создал этот вопрос еще тогда, когда я был действительно новичком в linux/bash и не осознавал, что существует такая вещь, как завершение табуляции.

2 ответа2

1

У меня есть функция для этого:

   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
   }

Использовать:

$ 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 #?:
0

Основная проблема с cd в интерактивном сеансе состоит в том, что вы обычно хотите изменить текущий каталог оболочки, обрабатывающей командную строку. Это означает, что запуск вспомогательной оболочки (например, скрипта) не поможет, поскольку любые вызовы cd не влияют на родительскую оболочку.

Однако в зависимости от того, какую оболочку вы используете, вы можете определить функцию для этого. Например, в 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]}"
}

Обратите внимание, что в этом примере я абсолютно отказываюсь анализировать вывод ls по ряду причин. Вместо этого я позволил самой оболочке получить список каталогов (или ссылки на каталоги)...

Тем не менее, я подозреваю, что использование этой функции (или чего-либо подобного) является очень хорошим способом настроить себя на огромный беспорядок - например, использовать rm после перехода в неправильный каталог. Автозаполнение имени файла уже достаточно опасно, не заставляя себя считать...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .