Перейти к терминалу каталога xth

Перейти к терминалу каталога xth

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

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

$ ls
$ first_dir second_dir third_really_long_and_complex_dir

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

ОБНОВЛЯТЬ

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

решение1

Основная проблема 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после перехода в неправильный каталог. Автодополнение имени файла само по себе достаточно опасно, не заставляя себясчитать...

решение2

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

   функция cdi. {
       ЕСЛИ=$'\n'
       СТРАНИЦА=${1:-1}
       ЛПП=${2:-11}
       первый=$(( 1 + LPP * СТРАНИЦА - LPP ))
       последний=$(( LPP * СТРАНИЦА ))
       выберите cd_into в $(find . -maxdepth 1 -type d -printf "%P\n" |\
             sed -n $first,${last}p);
       делать
           ВЫХОД=-1;
           если [[ $REPLY == n ]]; тогда пусть СТРАНИЦА=СТРАНИЦА+1; cdi. $СТРАНИЦА $LPP ; ВЫХОД=$?
         elif [[ $REPLY == p ]]; тогда пусть СТРАНИЦА=СТРАНИЦА-1; cdi. $PAGE $LPP ; ВЫХОД=$?
         elif [[ $REPLY == m ]]; тогда пусть LPP=LPP*2; cdi. $PAGE $LPP ; ВЫХОД=$?
         elif [[ $REPLY == l ]]; тогда пусть LPP=LPP/2; cdi. $PAGE $LPP ; ВЫХОД=$?
         elif [[ $REPLY == q || $REPLY == 0 ]]; затем вернуть 0; fi

           если [ $EXIT -eq 0 ]; тогда вернуть 0; фи

           cd_into=${cd_into//\~/$HOME}
           если [ -d "$cd_into" ];тогда
               cd "$cd_into"; вернуть 0; иначе
               echo "ой! \`$cd_into' не является папкой (?)"
           фи
       сделанный
       сбросить IFS
   }

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

$ cdi.
1) .mozilla.new 3) .swt 5) tmp 7) .vim 9) .ssh
2) .crack-attack 4) Загрузки 6) .Eterm 8) .frozen-bubble 10) .irssi
Который #?:

Связанный контент