Bash için bir dizin geçmişi var mı?


26

Bash'ın ters-arama-geçmişi (Ctrl-r) gibi bir şey var mı?

Atlamak istediğim bazı derin klasör hiyerarşilerim var, bu yüzden geriye doğru arama geçmişi gibi bir şey kullanmak istiyorum, ancak yalnızca klasör adlarını arar ve bana mutlak yollar verir.

Temelde, kullanmaya benzer sonuçlar verirdi, !?ancak yalnızca öndeki cd ile eşleşen komutları eşleştirin, sonuçları ve tam yolları adım adım uygulayabilirsiniz.

Şimdiye kadar, bulduğum en iyi çözüm bashmarks .


1
Son zamanlarda z kullanmaya başladım ve bu şimdiye kadar çalışıyor gibi görünüyor, ancak birkaç yol için kullandım.
Rob

Yanıtlar:


11

Autojump'a bir göz atın :

En çok kullanılan kabuk komutlarından biri “cd” dir. Arkadaşlarım arasında yapılan hızlı bir anket, yazdıkları tüm komutların% 10 ila 20'sinin aslında cd komutları olduğunu gösterdi! Ne yazık ki, sisteminizin bir bölümünden diğerine cd ile atlamak, neredeyse tam yola girmenizi gerektirir; bu çok pratik değildir ve çok fazla tuşa basılması gerekir.

otomatik atlama, dosya sisteminizde gezinmenin daha hızlı bir yoludur. Komut satırından en çok kullandığınız dizinlerin veritabanını koruyarak çalışır. Jumpstat komutu size veritabanının mevcut içeriğini gösterir. Veritabanı kullanılabilir duruma gelmeden önce biraz çalışmanız gerekir. Veritabanınız makul bir şekilde tamamlandığında, sıkça yazılan "cd" ed dizinine "atlayabilirsiniz":
j dirspec


Terminal'in başlığında sorunlara yol açabilir .
Daniel Beck

6

Var

cd -

Bu, daha önce bulunduğunuz dizine giden, aslında "derinlik 1" olan "cd [boşluk] [kısa çizgi]" komutudur. Tekrarlanan "cd -" iki dizin arasında ileri geri geçiş yapar.

Adam sayfasından alıntı:

Aşağıdaki işlenenler desteklenecektir: [...]

İşlenen olarak bir [kısa çizgi] kullanıldığında, bu komut ile aynı olacaktır:

      cd "$OLDPWD" && pwd

Ne yazık ki, gerçek bir yerleşik dizin geçmişi bilmiyorum.


Orada pushd dir popddizinlerin geçmişiniz yığını saklayabilir çifti. Bu, farklı klasörlerde çalışan komut dosyalarında gerçekten yararlıdır.
Jakuje

Biliyorum pushdve popdzaten burada da bahsedilir.
apurkrt

3

bash, popd / popd / dirs komutuna sahiptir. Bu .bashrc dizininde bash yığınının üzerindeki dizleri otomatik olarak itmek için var.

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

Bunları kullanın popdve kullanarak yığını görüntüleyindirs


2

İle iyi bir deneyim yaşadım Z-jump Tamamlanmasına izin veriyor, ancak yalnızca son hedef için, bir yolda ilerlememekle birlikte. Ancak sekme tamamlandıktan sonra tam yolu gösterir.


1

Sadece kendi tecrübelerime cevap vermek için, bir süre önce bu gereksinimi gidermek için basit bir komut dosyası yazdım, yerleşik cd komutunu, yeni bir dizin konumunu bir tarih dosyasına ekleyen basit bir işlevle geçersiz kılar, sonra bir python betiği kullanılır. Arama terimlerini girerken sıralı bir dizin listesini dinamik olarak güncelleyen bir bash arabirimi sağlar, bir şekilde bash komutunun tersi komutuyla aranır.

Merak edenler için git hub'da mevcut .


gearoid üzerinde kaya
Darth Egregious

1

ltcdDizin geçmişinde hızlı gezinmemi önermek istiyorum :

https://github.com/dczhu/ltcd

cd demo gif

Hayatı kolaylaştırmak için aşağıdaki özellikleri sunar:

  • Tüm terminal sekmelerinden / pencerelerinden son ziyaret edilen dizinleri gösteren genel dizin listesi.
  • Geçerli kabuk oturumuna yerel olan yerel dizin listesi.
  • Her iki liste de j / k (aşağı / yukarı), sayılar ve kelime arama özelliğini kullanarak hızlı gezinmeyi destekler.
  • Genel serbest atlama (örn. "Cd dir" veya "cd ar", / path / to / foo / bar / dizin / dizinine gitmek için).

1

Oh-my-zsh'ın bash üzerinde çalışan komutuna benzer işlevselliğe sahip bir betik hazırladım . Eğer oh-my-zsh'ı daha önce kullandıysanız , komutun sağladığı dizin geçmişinin terminalden her çıktığınızda sıfırlanacağını fark etmiş olabilirsiniz . Ancak bu betiği kullanırsanız olmayacak .dirs -vdirs -v

İşlevsellik:

  • İle en son kullanılan 10 dizinin listesini göster d.

  • Listedeki dizinin numarasını yazarak listedeki herhangi bir dizine atlayın. 10. dizine atlamak için 10 yerine 0 kullanmanız gerekir.

  • Dosyaları düzenlemek için v( vim ) her kullandığınızda veya o dizinde bir dosyayı açmak için o( xdg-open ) bir dizin yolu listenin en üstüne yerleştirilir . İsterseniz, bir dizini her ziyaret ettiğinizde.

Burada eylemde görebilirsiniz .


0

Peki, bu kod pasajını ~/.bashrc,

  1. özel bir cd komutu sağlar

        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. ve bir cd geçmişi arama komutu sağlar.

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

Tabii ki, sağladığım cdhist komutu istediğin gibi değil, çok basit. ancak istediğinize benzer bir şey elde etmek için vaka ifadeleri veya parametre genişletme kullanmak düşünülebilir.

Hatta tam cd /path/to/mydirkomut eklemek için benzersiz bir alt dizeye dayanan bazı "Programlanabilir tamamlama" işlevini bile ekleyebilirsiniz /path/to/unique/mydir, ancak bu yöntem hala yazmanızı gerektirir cd unique/mydir<tab>.


1
Kodunuzu yanlış okudum ve bash'in dirskomutunu temelde aynı şeyi yapan my_dirsbir satırda buldum .
idbrii

1
Güzel. Yani bash sadece onu desteklemiyor; o uygular bunu. Keşke bash'ın derin sihrini çalışmak için daha fazla zamanım olsaydı. Tabii ki, bu cd değil, sadece pushd hatırlamayı destekler. Ama sanırım alias cd=pushden zarif biçim olurdu.
jpaugh

0

Kendi inşa edebilirsiniz cdile komutu pushd, popd, dirs Yerleşik komutlar.

kullanım

  • cd -- (şimdiki geçmişi listele)

  • cd -num (num dizine gidin)

  • cd - (önceki dizine git)


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

Kapsamlı bir global CLI geçmişini saklamak için önceki çözümleri bir araya getiren ve bu aracı percol (C ^ R ile eşlenen) adı verilen etkileşimli bir grepping aracıyla bir araya getirdim. Çalıştıkları yere göre komutları almak ya da komutları kullanarak bir dizin bulmak için kullanıyorum. Kullanmaya başladığım ilk makinede, şimdi> 2 yıllık bir CLI geçmişiyle kayganlaşıyor.

Grep aracı hem yolda hem de komutta çalışır, ancak yine de sizin için yararlı olabilir. Ayrıca zsh içindeki 'dirs -v' bölümüne bakın.

https://github.com/gawells/ariadne


bu yol, komut ve tarih içeren bir CLI geçmişini depolar. Yalnızca yol değil, ancak geriye doğru arama dizinini (bash ve zsh) aramak için kullanışlıdır
Gordon Wells

Sanırım aracına bağlanmayı unuttun. Açıklamanızdan, bu komutların yalnızca çağrıldıkları yerden çalıştığındaki eksikliğinden şüpheleniyorum. Bu yüzden cd share/mansadece zaten / usr'daysam çalışır.
idbrii

ayy! benim hatam, metnin içine url'yi koyacağımı, bir şeylerin ters gittiğini farketmeyeceğimi düşündüm
Gordon Wells
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.