Apakah ada riwayat direktori untuk bash?

26

Apakah ada sesuatu seperti reverse-search-history (Ctrl-r) bash, tetapi hanya untuk direktori?

Saya memiliki beberapa hierarki folder yang mendalam yang ingin saya lompati, jadi saya ingin menggunakan sesuatu seperti reverse-search-history, tetapi hanya mencari nama folder dan memberi saya jalur absolut.

Pada dasarnya, ini akan memberikan hasil yang mirip dengan menggunakan !?tetapi hanya mencocokkan perintah dengan cd di depan, Anda dapat melangkah melalui hasil, dan path lengkap.

Sejauh ini, solusi terbaik yang saya temukan adalah bashmark .

idbrii
sumber
1
Saya baru-baru ini mulai menggunakan z dan sepertinya berfungsi sejauh ini, tetapi saya menggunakannya untuk beberapa jalur.
Rob

Jawaban:

11

Lihatlah autojump :

Salah satu perintah shell yang paling banyak digunakan adalah "cd". Sebuah survei cepat di antara teman-teman saya mengungkapkan bahwa antara 10 dan 20% dari semua perintah yang mereka ketik sebenarnya adalah perintah cd! Sayangnya, melompat dari satu bagian sistem Anda ke yang lain dengan cd mengharuskan Anda memasuki hampir seluruh jalur, yang tidak terlalu praktis dan membutuhkan banyak penekanan tombol.

autojump adalah cara yang lebih cepat untuk menavigasi sistem file Anda. Ini bekerja dengan memelihara database direktori yang paling sering Anda gunakan dari baris perintah. Perintah jumpstat menunjukkan kepada Anda konten database saat ini. Anda perlu bekerja sedikit sebelum database dapat digunakan. Setelah database Anda cukup lengkap, Anda dapat "melompat" ke direktori "cd" ed dengan mengetik:
j dirspec

Graham
sumber
Mungkin menyebabkan masalah dengan judul Terminal .
Daniel Beck
6

Ada

cd -

itu adalah perintah "cd [spasi] [tanda hubung]", yang masuk ke direktori Anda sebelumnya, pada dasarnya "sejarah kedalaman 1". "Cd -" yang berulang-kali berpindah-pindah antara dua direktori.

Mengutip halaman manual:

Operan berikut harus didukung: [...]

Ketika [tanda hubung] digunakan sebagai operan, ini harus setara dengan perintah:

      cd "$OLDPWD" && pwd

Sayangnya, saya tidak tahu tentang sejarah direktori bawaan yang sebenarnya.

apurkrt
sumber
Ada pushd dir popdpasangan yang dapat menyimpan tumpukan direktori sejarah Anda. Ini sangat membantu dalam skrip yang beroperasi di folder yang berbeda.
Jakuje
Saya tahu pushddan popd, dan itu juga sudah disebutkan di sini.
apurkrt
3

bash memiliki pushd / popd / dirs. Saya memilikinya di .bashrc saya untuk mendorong direktori secara otomatis ke tumpukan 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
}

Pop ini menggunakan popddan menampilkan tumpukan menggunakandirs

pengguna3131651
sumber
2

Saya telah memiliki pengalaman yang baik dengan z-jump. Hal ini memungkinkan penyelesaian, meskipun hanya untuk tujuan akhir, tidak melangkah melalui jalan. Itu memang menunjukkan path lengkap setelah penyelesaian tab.

ovid
sumber
1

Hanya untuk berpadu dengan pengalaman saya sendiri, saya menulis skrip sederhana untuk mengatasi persyaratan ini beberapa waktu yang lalu, itu menimpa perintah cd builtin dengan fungsi sederhana yang menambahkan lokasi direktori baru ke file sejarah, skrip python kemudian digunakan untuk menyediakan antarmuka bash yang secara dinamis memperbarui daftar direktori yang dipesan saat Anda memasukkan istilah pencarian, agak seperti pencarian perintah terbalik dari bash.

Ini tersedia di git-hub untuk mereka yang penasaran.

Murphy Gearoid
sumber
rock on gearoid
Darth
1

Saya ingin merekomendasikan saya ltcduntuk navigasi cepat melalui sejarah direktori:

https://github.com/dczhu/ltcd

demo cd gif

Ini menyediakan fitur berikut untuk membuat hidup lebih mudah:

  • Daftar direktori global, yang menunjukkan direktori terakhir yang dikunjungi dari semua tab / jendela terminal.
  • Daftar direktori lokal, yang merupakan sesi sesi shell lokal saat ini.
  • Kedua daftar mendukung navigasi cepat dengan menggunakan j / k (turun / naik), angka, dan pencarian kata.
  • Global free jumping (mis. "Cd dir" atau "cd ar" untuk menuju ke / path / ke / foo / bar / direktori /).
treulz
sumber
1

Saya telah membuat skrip yang memiliki fungsi serupa dengan perintah oh-my-zshdirs -v yang bekerja pada bash. Jika Anda pernah menggunakan oh-my-zsh , Anda mungkin telah memperhatikan bahwa riwayat direktori yang disediakan oleh perintah dirs -vakan diatur ulang setiap kali Anda keluar dari terminal. Namun, itu tidak akan terjadi jika Anda menggunakan skrip ini .

Fungsionalitas:

  • Perlihatkan daftar 10 direktori yang paling baru digunakan d.

  • Lompat ke direktori mana pun dalam daftar dengan mengetikkan nomor direktori dalam daftar. Anda perlu menggunakan 0 bukannya 10 untuk melompat ke direktori ke-10.

  • Jalur direktori akan diletakkan di bagian atas daftar setiap kali Anda menggunakan v( vim ) untuk mengedit file atau o( xdg-buka ) untuk membuka file dari direktori itu. Atau jika Anda suka, setiap kali Anda mengunjungi direktori.

Anda dapat melihatnya beraksi di sini .

M Imam Pratama
sumber
0

Nah, Anda bisa menambahkan potongan kode ini ke ~/.bashrc, yang

  1. menyediakan perintah cd khusus

        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. dan memberikan perintah pencarian riwayat cd.

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

Tentu saja, perintah cd yang saya berikan sangat mendasar, dan bukan yang Anda inginkan; tetapi dimungkinkan untuk menggunakan pernyataan kasus atau ekspansi parameter untuk mencapai sesuatu yang mirip dengan yang Anda inginkan.

Anda bahkan dapat menambahkan beberapa fungsi "Programmable completion", yang dapat digunakan untuk menambahkan cd /path/to/mydirperintah penuh berdasarkan sub-string unik /path/to/unique/mydir, meskipun metode itu masih mengharuskan Anda untuk mengetik cd unique/mydir<tab>.

jpaugh
sumber
1
Saya salah membaca kode Anda dan menemukan dirsperintah bash yang pada dasarnya melakukan hal yang sama my_dirs, tetapi pada satu baris.
idbrii
1
Keren. Jadi, bash tidak hanya mendukungnya; itu mengimplementasikannya . Saya berharap saya memiliki lebih banyak waktu untuk mempelajari sihir bash yang mendalam. Tentu saja, ini hanya mendukung mengingat pushd, bukan cd. Tapi saya kira alias cd=pushdakan menjadi bentuk yang paling elegan.
jpaugh
0

Anda dapat membangun sendiri cdperintah dengan pushd, popd, dirs perintah builtin.

Pemakaian

  • cd -- (daftar riwayat saat ini)

  • cd -num (buka direktori num)

  • cd - (buka direktori sebelumnya)


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
sumber
-1

Saya menggabungkan alat ini, yang menggabungkan solusi sebelumnya untuk menyimpan sejarah CLI global yang komprehensif dengan alat grepping interaktif yang disebut percol (dipetakan ke C ^ R). Saya menggunakannya untuk mengambil perintah di mana mereka dijalankan atau untuk menemukan direktori dengan perintah. Masih licin pada mesin pertama yang saya mulai menggunakannya, sekarang dengan riwayat CLI> 2 tahun.

Alat grep bekerja di kedua jalur dan perintah, tetapi mungkin masih berguna bagi Anda. Lihat juga 'dirs -v' di zsh

https://github.com/gawells/ariadne

Gordon Wells
sumber
ini menyimpan sejarah CLI dengan jalur, perintah dan tanggal. Ini bukan hanya jalur, tapi masih berguna untuk membalikkan riwayat pencarian dir (bash dan zsh)
Gordon Wells
Saya pikir Anda lupa menautkan ke alat Anda. Dari uraian Anda, saya menduga itu kurang dalam perintah yang hanya bekerja dari tempat mereka dipanggil. Jadi cd share/manhanya berfungsi jika saya sudah di / usr.
idbrii
Ups! salahku, kupikir aku akan memasukkan url ke dalam teks, tidak melihat ada yang tidak beres
Gordon Wells