Чи є історія каталогу для bash?


26

Чи є щось на зразок історії зворотного пошуку bash (Ctrl-r), але лише для каталогів?

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

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

Поки що найкраще рішення, яке я знайшов, - це башмари .


1
Нещодавно я почав використовувати z, і це, здається, працює до цих пір, але я використовував його для кількох шляхів.
Роб

Відповіді:


11

Погляньте на автоперемикач :

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

autojump - це більш швидкий спосіб навігації по вашій файловій системі. Він працює, підтримуючи базу даних каталогів, якою ви найбільше користуєтесь з командного рядка. Команда jumpstat показує вам поточний вміст бази даних. Вам потрібно трохи попрацювати, перш ніж база даних стане придатною для використання. Після того, як ваша база даних буде достатньо повна, ви можете "перейти" до загально "CD" ed каталог, ввівши:
j dirspec


Це може призвести до проблем із заголовком терміналу .
Даніель Бек

6

є

cd -

тобто команда "cd [space] [дефіс]", яка переходить до каталогу, в якому ви були раніше, по суті є "історією глибини 1". Повторне "cd -" перемикається вперед і назад між двома каталогами.

Цитуючи сторінку чоловіка:

Підтримуються наступні операнди: [...]

Якщо в якості операнду використовується [дефіс], це буде еквівалентно команді:

      cd "$OLDPWD" && pwd

На жаль, я не знаю реальної вбудованої історії каталогів.


Є pushd dir popdпара, яка може зберігати ваш стек історії каталогів. Це дуже корисно для сценаріїв, які працюють у різних папках.
Якову

Я знаю 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


2

Я мав хороший досвід з z-jump. Це дозволяє виконати, хоча тільки для кінцевого пункту призначення, не переходячи шлях. Однак він показує повний шлях після завершення вкладки.


1

Тільки для того, щоб заручитися власним досвідом, я написав простий скрипт, щоб вирішити цю вимогу деякий час тому, він переосмислює вбудовану компакт-диск з простою функцією, яка додає нове розташування каталогів до файлу історії, потім використовується сценарій python надайте інтерфейс bash, який динамічно оновлює впорядкований список каталогів під час введення пошукових термінів, дещо як зворотний пошук команди bash.

Він доступний на git-hub для тих, хто цікавиться.


рок на геароїді
Дарт

1

Я хотів би порекомендувати мою ltcdшвидку навігацію по історії каталогу:

https://github.com/dczhu/ltcd

cd demo gif

Він забезпечує наступні функції для полегшення життя:

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

1

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

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

  • Показати список 10 останніх використовуваних каталогів d.

  • Перейдіть до будь-якого каталогу у списку, ввівши номер каталогу у списку. Щоб перейти до 10-ї директорії, вам потрібно використовувати 0, а не 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, яку я надав, є дуже основною, і не такою, яку ви хотіли; але можливо використовувати виписки з регістру або розширення параметрів для досягнення чогось подібного до того, що ви хочете.

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


1
Я неправильно прочитав ваш код і знайшов dirsкоманду bash, яка робить по суті те саме, що і в my_dirsодному рядку.
idbrii

1
Класно. Тож не тільки баш підтримує це; вона реалізує це. Я б хотів, щоб у мене було більше часу на вивчення глибокої магії Баша. Звичайно, це підтримує лише запам'ятовування 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

-1

Я поєднав цей інструмент, який поєднує попередні рішення для зберігання всеосяжної глобальної історії CLI з інтерактивним інструментом зібрання під назвою percol (відображений на C ^ R). Я використовую його для отримання команд за тим, де вони були запущені, або для пошуку каталогу за допомогою команди. На першому апараті, який я почав використовувати, він все ще гладкий, тепер він має 2-річну історію CLI.

Інструмент grep працює як на шляху, так і на команді, але може бути корисним для вас. Дивіться також "dirs -v" в zsh

https://github.com/gawells/ariadne


тут зберігається історія CLI з маршрутом, командою та датою. Це не лише шлях, але все ще корисний для зворотного пошуку історії dir (bash and zsh)
Gordon Wells

Я думаю, ти забув посилання на свій інструмент. З вашого опису, я б підозрював, що він є недостатнім у тому, що команди працюють лише там, де вони викликані. Тож cd share/manпрацює лише в тому випадку, якщо я вже в / usr.
idbrii

ой! мені погано, я думав, що я вставлю URL в текст, не помітив, що щось пішло не так
Гордон Уеллс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.