Czy istnieje historia katalogów dla bash?


26

Czy istnieje coś takiego jak historia wyszukiwania wstecznego w bash (Ctrl-r), ale tylko dla katalogów?

Mam kilka głębokich hierarchii folderów, do których chcę przejść, więc chciałbym użyć czegoś takiego jak historia wyszukiwania wstecznego, ale szuka ona tylko nazw folderów i podaje absolutne ścieżki.

Zasadniczo dałby podobne wyniki do używania, !?ale tylko dopasowania poleceń z cd z przodu, możesz przechodzić między wynikami i pełnymi ścieżkami.

Jak dotąd najlepszym rozwiązaniem, jakie znalazłem, są znaki kreskowe .


1
Niedawno zacząłem używać Z i wydaje się, że do tej pory działało, ale użyłem go do kilku ścieżek.
Rob

Odpowiedzi:


11

Spójrz na autojump :

Jednym z najczęściej używanych poleceń powłoki jest „cd”. Szybka ankieta wśród moich znajomych wykazała, że ​​od 10 do 20% wszystkich poleceń, które wpisują, to tak naprawdę polecenia cd! Niestety przeskakiwanie z jednej części systemu do drugiej za pomocą cd wymaga przejścia prawie pełną ścieżkę, co nie jest zbyt praktyczne i wymaga dużej ilości naciśnięć klawiszy.

autojump to szybszy sposób poruszania się po systemie plików. Działa poprzez utrzymywanie bazy danych katalogów, których najczęściej używasz z wiersza poleceń. Komenda jumpstat pokazuje bieżącą zawartość bazy danych. Musisz trochę popracować, zanim baza danych stanie się użyteczna. Gdy baza danych zostanie właściwie ukończona, możesz „przeskoczyć” do często edytowanego katalogu „cd”, wpisując:
j dirspec


Może to prowadzić do problemów z tytułem Terminala .
Daniel Beck

6

Jest

cd -

to jest polecenie „cd [spacja] [łącznik]”, które przechodzi do katalogu, w którym byłeś wcześniej, zasadniczo „historii głębi 1”. Powtarzane „cd -” przełącza się między dwoma katalogami.

Cytując stronę podręcznika:

Obsługiwane są następujące argumenty: [...]

Gdy jako argument jest używany [myślnik], będzie to równoznaczne z poleceniem:

      cd "$OLDPWD" && pwd

Niestety nie znam prawdziwej wbudowanej historii katalogów.


Istnieje pushd dir popdpara, która może przechowywać stos historii katalogów. Jest to bardzo pomocne w skryptach działających w różnych folderach.
Jakuje,

Wiem o tym pushdi popdjuż tu jest wspomniane.
apurkrt

3

bash ma pushd / popd / dirs. Mam to w moim .bashrc, aby automatycznie wypychać katalogi na stos basha.

#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
}

Usuń je za pomocą popdi wyświetl stos za pomocądirs


2

Miałem dobre doświadczenia ze skokiem z. Umożliwia ukończenie, chociaż tylko do ostatecznego celu, nie krocząc ścieżką. Jednak pokazuje pełną ścieżkę po zakończeniu zakładki.


1

Po prostu z własnego doświadczenia napisałem jakiś prosty skrypt, aby spełnić to wymaganie jakiś czas temu, zastępuje on wbudowane polecenie cd prostą funkcją, która dołącza nową lokalizację katalogu do pliku historii, następnie używa się skryptu python do zapewnia interfejs bash, który dynamicznie aktualizuje uporządkowaną listę katalogów podczas wprowadzania wyszukiwanych haseł, podobnie jak wyszukiwanie poleceń bash w odwrotnej kolejności.

Jest dostępny na git-hub dla tych, którzy są ciekawi.


rock on gearoid
Darth Egregious

1

Chciałbym polecić mój ltcddo szybkiej nawigacji po historii katalogów:

https://github.com/dczhu/ltcd

demo cd gif

Zapewnia następujące funkcje ułatwiające życie:

  • Globalna lista reż., Która pokazuje ostatnio przeglądane rewersy ze wszystkich kart / okien terminala.
  • Lokalny katalog katalogu, który jest lokalny dla bieżącej sesji powłoki.
  • Obie listy obsługują szybką nawigację za pomocą j / k (góra / dół), liczb i wyszukiwania słów.
  • Global free jumping (np. „Cd dir” lub „cd ar”, aby przejść do / path / to / foo / bar / directory /).

1

Stworzyłem skrypt, który ma podobną funkcjonalność do polecenia oh-my-zsh,dirs -v które działa na bash. Jeśli kiedykolwiek używałeś oh-my-zsh , mogłeś zauważyć, że historia katalogów podana przez polecenie dirs -vbędzie resetowana za każdym razem, gdy wyjdziesz z terminala. Nie stanie się to jednak, jeśli użyjesz tego skryptu .

Funkcjonalność:

  • Pokaż listę 10 ostatnio używanych katalogów z d.

  • Przejdź do dowolnego katalogu na liście, wpisując numer katalogu na liście. Musisz użyć 0 zamiast 10, aby przejść do 10. katalogu.

  • Ścieżka do katalogu będzie umieszczana na górze listy za każdym razem, gdy użyjesz v( vim ) do edycji plików lub o( xdg-open ), aby otworzyć plik z tego katalogu. Lub jeśli chcesz, za każdym razem, gdy odwiedzasz katalog.

Możesz to zobaczyć tutaj w akcji .


0

Możesz dodać ten fragment kodu do swojego ~/.bashrc, który

  1. udostępnia niestandardowe polecenie 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. i udostępnia polecenie wyszukiwania historii cd.

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

Oczywiście podane przeze mnie polecenie cdhist jest bardzo proste, a nie to, czego chciałeś; ale możliwe jest użycie instrukcji case lub rozszerzenia parametrów, aby osiągnąć coś podobnego do tego, co chcesz.

Możesz nawet dodać funkcję „Programowalnego zakończenia”, która mogłaby zostać użyta do dodania pełnego cd /path/to/mydirpolecenia na podstawie unikatowego ciągu podrzędnego /path/to/unique/mydir, chociaż metoda ta nadal wymagałaby wpisania cd unique/mydir<tab>.


1
Źle odczytałem twój kod i znalazłem dirspolecenie bash, które zasadniczo robi to samo my_dirs, ale w jednym wierszu.
idbrii

1
Fajne. Więc bash nie tylko go obsługuje; to realizuje go. Chciałbym mieć więcej czasu na studiowanie głębokiej magii basha. Oczywiście obsługuje to tylko zapamiętywanie pushd, a nie cd. Ale przypuszczam alias cd=pushd, że byłaby to najbardziej elegancka forma.
jpaugh

0

Możesz budować własną cdkomendę z pushd, popd, dirs wbudowanych poleceń.

Stosowanie

  • cd -- (wyświetl aktualną historię)

  • cd -num (przejdź do katalogu num)

  • cd - (przejdź do poprzedniego katalogu)


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

Złożyłem to narzędzie, które łączy poprzednie rozwiązania do przechowywania kompleksowej globalnej historii CLI z interaktywnym narzędziem grepping o nazwie percol (mapowane na C ^ R). Używam go do pobierania poleceń według miejsca ich uruchomienia lub do znajdowania katalogu za pomocą polecenia. Nadal jest zręczny na pierwszym komputerze, z którego zacząłem go używać, teraz z ponad 2-letnią historią CLI.

Narzędzie grep działa zarówno na ścieżce, jak i poleceniu, ale może być dla Ciebie przydatne. Zobacz także 'dirs -v' w zsh

https://github.com/gawells/ariadne


przechowuje historię CLI ze ścieżką, poleceniem i datą. Nie jest to tylko ścieżka, ale nadal jest przydatne do wyszukiwania wstecznego historii katalogu (bash i zsh)
Gordon Wells,

Myślę, że zapomniałeś link do swojego narzędzia. Na podstawie twojego opisu podejrzewam, że jest on wadliwy, ponieważ polecenia działają tylko od miejsca, w którym są wywoływane. Tak cd share/mandziała tylko jeśli jestem już w / usr.
idbrii

ups! mój zły, myślałem, że wstawię adres URL w tekście, nie zauważyłem, że coś poszło nie tak
Gordon Wells,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.