24

Есть ли что-то вроде истории обратного поиска bash (Ctrl-r), но только для каталогов?

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

По сути, это даст аналогичные результаты использования !? но только сопоставляя команды с cd впереди, вы можете просматривать результаты и полные пути.

Пока что лучшее решение, которое я нашел, - это отметки.

9 ответов9

11

Посмотрите на autojump:

Одной из наиболее часто используемых команд оболочки является "cd". Быстрый опрос среди моих друзей показал, что от 10 до 20% всех команд, которые они вводят, на самом деле являются командами cd! К сожалению, переход с одной части вашей системы на другую с помощью cd требует ввода почти полного пути, что не очень удобно и требует много нажатий клавиш.

autojump - более быстрый способ навигации по вашей файловой системе. Он работает, поддерживая базу данных каталогов, которые вы используете чаще всего из командной строки. Команда jumpstat показывает вам текущее содержимое базы данных. Вам нужно немного поработать, прежде чем база данных станет пригодной для использования. Как только ваша база данных будет достаточно полной, вы можете "перейти" к общедоступному каталогу cd, набрав:
j dirspec

6

Есть

cd -

это команда «cd [space] [дефис]», которая переходит в каталог, в котором вы были, по сути, "история глубины 1". Повторное «cd -» переключается между двумя каталогами.

Цитирование справочной страницы:

Следующие операнды должны поддерживаться: [...]

Когда [дефис] используется в качестве операнда, это должно быть эквивалентно команде:

      cd "$OLDPWD" && pwd

К сожалению, я не знаю реальной встроенной истории каталогов.

3

Bash имеет pushd/popd/dirs. У меня есть это в моем .bashrc для автоматического перемещения каталогов в стек bash.

#let cd also pushd directories into stack. Use popd to reverse stack
function cd ()
{
  if [ -e $1 ]; then 
    pushd $1 &> /dev/null   #dont display current stack 
  fi
}

Вставьте их, используя popd и отобразите стек, используя dirs

1

Я бы порекомендовал мой ltcd для быстрой навигации по истории каталогов:

https://github.com/dczhu/ltcd

CD демо GIF

Это обеспечивает следующие функции, чтобы сделать жизнь проще:

  • Глобальный список каталогов, который показывает недавно посещенные каталоги из всех вкладок / окон терминала.
  • Список локальных каталогов, который является локальным для текущего сеанса оболочки.
  • Оба списка поддерживают быструю навигацию с помощью j / k (переход вниз / вверх), чисел и поиска слов.
  • Глобальный свободный прыжок (например, "cd dir" или "cd ar" для перехода в / path / to / foo / bar / directory /).
1

У меня был хороший опыт работы с z-прыжком. Это позволяет завершить, хотя только для конечного пункта назначения, а не идти по пути. Тем не менее, он показывает полный путь после завершения вкладки.

1

Просто чтобы поделиться своим собственным опытом, я написал простой сценарий для удовлетворения этого требования некоторое время назад, он переопределяет встроенную команду cd простой функцией, которая добавляет новое местоположение каталога в файл истории, затем используется сценарий python для предоставляет интерфейс bash, который динамически обновляет упорядоченный список каталогов при вводе условий поиска, что напоминает поиск команды bash в обратном порядке.

Он доступен на git-hub для любопытных.

0

Вы можете создать свою собственную команду cd с помощью встроенных команд pushd , popd , dirs .

использование

  • cd -- (список текущей истории)

  • cd -num (перейти в каталог num)

  • cd - (перейти в предыдущий каталог)


function cd()
{
    local hnum=16  # number of entries
    local new_dir index dir cnt
    if ! [ $# -eq 0 ]; then
        if [[ $# -eq 2 && $1 = "--" ]]; then
            shift
        else 
            if ! { [ $# -eq 1 ] && [[ $1 =~ ^(-[0-9]{,2}|-|--|[^-].*)$ ]] ;}
            then
                builtin cd "$@"
                return
            fi
        fi
    fi
    [ "$1" = "--" ] && { dirs -v;  return ;}
    new_dir=${1:-$HOME}
    if [[ "$new_dir" =~ ^(-[0-9]{,2}|-)$ ]]; then
        index=${new_dir:1}
        [ -z "$index" ] && index=1
        new_dir=$(dirs -l +$index) || return
    fi
    pushd -- "$new_dir" > /dev/null || return
    popd -n +$hnum &> /dev/null
    new_dir=$PWD cnt=1
    while dir=$(dirs -l +$cnt 2> /dev/null); do
        if [ "$dir" = "$new_dir" ]; then
            popd -n +$cnt > /dev/null
            continue
        fi
        let cnt++
    done
}

export -f cd
0

Ну, вы можете добавить этот фрагмент кода в ваш ~/.bashrc , который

  1. предоставляет пользовательскую команду CD

        function cd ()
        {
            exists=false
            for dir in "${CDHIST[@]}"; do
                [ "$dir" == "$1" ] && {
                    exists == true
                    break
                }
            done
    
            $exists || {
                len=${#CDHIST[@]}
                ${CDHIST[$len]} = "$1"
            }
    
            builtin cd "$1"
        }
    
  2. и предоставляет команду поиска в истории CD.

    function cdhist ()
    {
        #TODO: Make this magical.
    
        for dir in "${CDHIST[@]}"; do
            echo "$dir"
        done
    }
    

Конечно, команда cdhist, которую я предоставил, очень проста, а не то, что вы хотели; но возможно использовать операторы case или расширение параметров для достижения чего-то похожего на то, что вы хотите.

Вы даже можете добавить некоторую функцию "Программируемое завершение", которую можно использовать для добавления полной команды cd /path/to/mydir основанной на уникальной подстроке /path/to/unique/mydir , хотя этот метод по-прежнему требует введите cd unique/mydir<tab> .

-1

Я собрал этот инструмент, который сочетает в себе предыдущие решения для хранения всеобъемлющей глобальной истории CLI с интерактивным инструментом под названием percol (сопоставленным с C ^ R). Я использую его для получения команд по месту их выполнения или для поиска каталога по команде. Это все еще замечательно на первой машине, которую я начал использовать, теперь с> 2-летней историей CLI.

Инструмент grep работает как с путями, так и с командами, но может быть полезен для вас. Смотрите также 'dirs -v' в zsh

https://github.com/gawells/ariadne

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