Есть ли история каталогов для bash?

26

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

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

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

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

idbrii
источник
1
Я недавно начал использовать z, и это, кажется, пока работает, но я использовал его для нескольких путей.
Роб

Ответы:

11

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

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

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

Грэхем
источник
Это может привести к проблемам с названием терминала .
Даниэль Бек
6

Есть

cd -

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

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

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

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

      cd "$OLDPWD" && pwd

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

apurkrt
источник
Есть pushd dir popdпара, которая может хранить вашу историю стека каталогов. Это действительно полезно в сценариях, которые работают в разных папках.
Jakuje
Я знаю pushdи popd, и это также упоминается здесь уже.
apurkrt
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

user3131651
источник
2

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

Овидий
источник
1

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

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

Гиероид Мерфи
источник
скала на редукторе
Дарт Эгредиус
1

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

https://github.com/dczhu/ltcd

CD демо GIF

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

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

Я создал скрипт , который по функциональности похож наdirs -v команду oh-my-zsh, которая работает на bash. Если вы когда-либо использовали oh-my-zsh , вы могли заметить, что история каталогов, предоставляемая командой, dirs -vбудет сбрасываться каждый раз, когда вы выходите из терминала. Однако этого не произойдет, если вы воспользуетесь этим скриптом .

Функциональность:

  • Показать список 10 последних использованных каталогов с d.

  • Перейдите к любому каталогу в списке, набрав номер каталога в списке. Вам нужно использовать 0 вместо 10, чтобы перейти к 10-му каталогу.

  • Путь к каталогу будет помещаться в верхнюю часть списка каждый раз, когда вы используете v( vim ) для редактирования файлов или o( xdg-open ), чтобы открыть файл из этого каталога. Или, если хотите, каждый раз, когда вы посещаете каталог.

Вы можете увидеть это в действии здесь .

М Имам Пратама
источник
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>.

jpaugh
источник
1
Я неправильно прочитал ваш код и нашел dirsкоманду bash, которая делает то же самое my_dirs, но в одной строке.
idbrii
1
Круто. Так что Bash не только поддерживает это; это реализует это. Хотел бы я иметь больше времени для изучения глубокой магии Баша. Конечно, это поддерживает только запоминание pushd, а не cd. Но я полагаю, alias cd=pushdбудет самая элегантная форма.
jpaugh
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
mug896
источник
-1

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

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

https://github.com/gawells/ariadne

Гордон Уэллс
источник
это хранит историю CLI с путем, командой и датой. Это не только путь, но все же полезно для обратного поиска в истории
Гордон Уэллс
Я думаю, что вы забыли ссылку на свой инструмент. Из вашего описания я подозреваю, что недостаток в том, что команды работают только там, где они вызываются. Так cd share/manработает только если я уже в / usr.
idbrii
упс! мой плохой, я думал, что я вставил URL в текст, не заметил, что что-то пошло не так
Гордон Уэллс