CD, просто набрав имя каталога?

58

У меня было это где-то 20 лет назад, или я мечтал об этом.

В основном:

Если, если типа blobblobя получаю
blobblob: command not found

Справедливо.

Мне бы хотелось, чтобы, когда моя оболочка получала эти ошибки (команда не найдена), она проверяла, существует ли каталог с таким именем ('blobblob') и относится ли он cdк этому каталогу.

Я уверен, что есть некоторые причины не делать этого или делать это с осторожностью.
Я просто думаю, что это было бы довольно опрятно, хотя, и я хотел бы попробовать это, находя где-то (как здесь!).

Я понятия не имею, как сделать своего рода программирование оболочки это может означать.

Майкл Даррант
источник

Ответы:

76
  • Bash: shopt -s autocd
  • Zsh: setopt autocd
  • Tcsh: set implicitcd

Кроме того, «AutoJump» является полезным инструментом. После установки он запоминает каталоги, так что вы можете набрать j abc, и если вы уже посещали abc, скажем, x / d / f / g / t / abc, то он перейдет туда!
https://github.com/joelthelion/autojump

jw013
источник
1
Да, я набрал shopt -s autocdв командной строке, это сработало. Теперь я могу просто начать вводить имена каталогов и использовать автозаполнение, а затем нажать return и оболочку cdв каталог. Так круто !
Майкл Даррант
6
Отлично. Спасибо, что указали на ошибку, чтобы избежать.
vonbrand
3
Я не использую это - cdэто не так сложно набрать, и большинство механизмов завершения табуляции более умны, когда вы даете им больше контекста.
jw013
После возврата к чрезмерному восклицанию признательности, позвольте мне сказать, что autocd действительно правильный ответ: D
Люк
autocdShopt был добавлен в Баш версии 4. Так что не доступно на MacOS (который до сих пор Баш версии 3.xx) , если заместитель, не будет установлен новый Баш (например, через самодельный).
Куинн Комендант
2

Утилита autojump обеспечивает аналогичный механизм с Наиболее загруженным списком каталогов. Это, однако, требует дополнительной утомляемости при наборе текста, jSpaceно это компенсируется правильным угадыванием чаще, чем нет.

Это самый близкий к DWIM, который я использовал на сегодняшний день.

MSW
источник
1

Однажды я сделал полезный скрипт для аналогичной цели с функцией fcd для find-n-cd.

Вы вводите, fcd fooи может произойти 3 вещи:

  • Такой каталог foo не найден, затем он возвращается с "no such directory " $1
  • Обнаружен один файл: он проверяет, является ли он каталогом (или просто файлом), и, если это так, он записывается туда.
  • Найдено несколько файлов - затем отображается выбор, в котором вы просто вводите номер выбора (или специальный номер для возврата).

Это похоже на то, что вам не нужно вводить весь путь, но вы явно вызываете функцию.

#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo 
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd () 
{
    list=$(locate $1 | egrep "/$1$")
    count=$(echo $list | wc -w )
    case $count in 
      0) 
        echo "unknown directory: "$1 && return
        # could search for partial matches Doc => Documentation
        ;;
      1) 
        if [[ -d "$list" ]]; then
        echo "$list";
        cd "$list";
        else
            echo "not a directory: $1"
        fi
        ;;
      *) 
        select directory in $list "/exit/" 
        do
          if [[ "$directory" = "/exit/" ]]; then break; fi
          if [[ -d "$directory" ]]; then
                echo "$directory";
                cd "$directory";
            break
          else
            echo "not a directory: "$1 
          fi
        done     
        ;;
   esac
}

Вы должны sourceиспользовать функцию ( source fcd.sh| . fcd.sh) и не можете вызывать ее как скрипт, потому cdчто иначе это произойдет только в контексте скрипта, и после ее завершения вы сразу же вернетесь в свой начальный каталог.

Так как он работает locate, он довольно быстро находит каталоги (но не всегда в курсе).

Он не обрабатывает пробелы в именах каталогов изящно. Если у вас есть элегантное решение проблемы, я был бы счастлив.

неизвестный пользователь
источник
1
Вопрос был в том, чтобы cdавтоматически, без ввода какой-либо команды. Этот ответ больше подходит для быстрой навигации по каталогу в терминале .
manatwork
2
@manatwork: Ну, вы можете объединить команду с обработчиком ошибок bash. В /etc/bash.bashrcUbuntu есть объект, function command_not_found_handleкоторый выглядит так, как будто его можно изменить.
пользователь неизвестен
Попался. Этот способ звучит намного лучше.
manatwork
@manatwork: Я бы сделал это сам, если бы я хотел использовать это сам. Но если я хочу сменить каталог, мне нравится использовать короткую команду, но если я что-то неправильно набираю, я редко забываю вводить 3 или 4 символа. Наличие этого шага программы было бы довольно раздражающим для меня, но использовать его явно хорошо.
пользователь неизвестен
1

Это также работает,

cdf name_of_file_or_directory

..в связи с тем, что вы создали собственный сценарий cdf.sh (ниже), полученный из оболочки. Для каталога в качестве параметра этот сценарий попадает только в родительский каталог для найденного каталога. Добавьте следующую строку в ваш .bashrc или .zshrc, что угодно ..

source ~/bin/cdf.sh 

И добавьте этот код в файл ~ / bin / cdf.sh, который вам нужно создать с нуля.

#!/bin/bash

function cdf() {
    THEFILE=$1
    echo "cd into directory of ${THEFILE}"
    # For Mac, replace find with mdfind to get it a lot faster. And it does not need args ". -name" part.
    THEDIR=$(find . -name ${THEFILE} |head -1 |grep -Eo "/[ /._A-Za-z0-9\-]+/")
    cd ${THEDIR}
}
Вилле Лайтила
источник
Отличный ответ на старый вопрос. Я полагаю, вы получите значок для восстановления старого вопроса, и добро пожаловать в U & L.SE
eyoung100
0

Поместите это в свой ~/.bashrc

  #aliases to cd into the core dirs
  PROJECT_PARENT_DIRS[0]="$HOME/repos"
  #you can make it search more dirs by assigning new indexes to your other root dirs

  for PARENT_DIR in ${PROJECT_PARENT_DIRS[@]} ; do
    if [ -d "$PARENT_DIR" ]; then
      for PROJECT_DIR in $(/bin/ls $PARENT_DIR); do
        if [ ! -z `which $PROJECT_DIR` ]; then
          continue # don't set alias if there is something already a command on the path with the same name
        fi
        if [ -d "$PARENT_DIR/$PROJECT_DIR" ]; then
          alias "$PROJECT_DIR"="cd $PARENT_DIR/$PROJECT_DIR"
        fi
      done
    fi
  done
  #end alias
Хаджа Минхаджуддин
источник