Есть ли способ в оболочке 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 Который #?: