"Bookmark" untuk bash


24

Menavigasi beberapa lapisan direktori bersarang sering kali menyebalkan. Di Firefox, mudah karena mereka memiliki bookmark. Jadi yang ingin saya lakukan untuk menandai file adalah dengan mengetik:

$ go --add classes "repo/www/public/util/classes"

Lalu, untuk masuk ke direktori ini, saya akan mengetik:

$ go classes

Sebelumnya saya telah menggunakan tautan simbolis, untuk mencapai sesuatu yang serupa, tetapi saya tidak ingin mengacaukan direktori rumah saya. Ada banyak fitur lain yang terbukti bermanfaat. Misalnya, saya ingin dapat mulai mengetik go cldan kemudian tekan tab untuk melengkapi otomatis. Kadang-kadang saya memiliki beberapa salinan repositori yang sudah diperiksa dan karenanya akan berguna bagi program untuk memungkinkan saya membuat beberapa konteks dan untuk mengatur bookmark relatif ke direktori basis konteks.

Jadi, sebelum saya mulai membuat skrip sendiri, apakah sudah ada yang seperti ini?



4
Jika Anda terus membandingkan bash dengan firefox, seseorang akan membuat awesomebar untuk bash :(
hhaamu

Jawaban:


12

Saya mencari alat bookmark-shell terlalu lama, dan saya tidak puas dengan solusi yang saya temukan.

Namun, akhirnya saya menemukan alat universal yang hebat: command-line fuzzy finder .

Ini terutama memungkinkan Anda untuk "mencari fuzzy" file (periksa animasi kaya gif dengan tautan di atas), tetapi juga memungkinkan untuk memberi makan data teks sewenang-wenang padanya dan menyaring data ini. Jadi, ide cara pintasnya sederhana: yang kita butuhkan adalah memelihara file dengan path (yang merupakan jalan pintas), dan fuzzy-filter file ini. Begini tampilannya: kami mengetik cdgperintah (dari "cd global", jika Anda mau), dapatkan daftar bookmark kami, pilih yang diperlukan hanya dengan beberapa penekanan tombol, dan tekan Enter. Direktori kerja diubah ke item yang dipilih:

cdg

Ini sangat cepat dan mudah: biasanya saya cukup mengetik 3-4 huruf dari barang yang dibutuhkan, dan semua yang lain sudah disaring. Selain itu, tentu saja kita dapat menelusuri daftar dengan tombol panah atau dengan Ctrl+j/ Ctrl+k.

Artikel terperinci tentang solusi pintasan / bookmark ini ada di sini: Pintasan fuzzy untuk shell Anda .


19

Saya pikir Anda sedang mencari sesuatu seperti autojump . Anda harus berkeliling sedikit untuk mengembangkan satu set "bobot kunci" yang berkorelasi dengan jumlah waktu yang dihabiskan dalam direktori tertentu. Kemudian, dengan asumsi Anda menghabiskan banyak waktu di dir 'kelas' itu, Anda bisa langsung ke sana dengan mengetik

j cl

Anda dapat melihat "bobot kunci" Anda dengan

jumpstat

Baru-baru ini saya menemukan alat yang lebih kompleks, tetapi menarik, dan terkait, bernama f: github.com/clvv/f
tcdyl

14

Seperti disebutkan, alias adalah mekanisme yang baik. Shell bash juga memiliki built-in mekanisme untuk melompat tepat ke lokasi: CDPATH. Setel seperti PATH, tetapi digunakan cdalih-alih mencari program.

$ CDPATH=:~/repo/www/public/util
$ cd classes
/home/casebash/repo/www/public/util/classes

Dari halaman manual:

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

Saya sendiri, saya telah menggabungkan ini dengan direktori yang memiliki symlink ke tempat saya ingin pergi:

$ mkdir ~/cdshortcut
$ ln -s ~/repo/www/public/util/classes ~/cdshortcut/classes
$ CDPATH=:~/cdshortcut
/home/casebash/cdshortcut/classes

Ini memiliki kelemahan bahwa direktori tampaknya tidak benar, tetapi itu bisa diperbaiki menggunakan cd -Patau pengaturan set -P.


CDPATH memang menarik, tetapi mungkin layak menggunakan perintah go terpisah sehingga perilakunya selalu dapat diprediksi
Casebash

1
+1 untuk set -P. Beberapa symlink saya membuat saya gila karena saya tidak dapat mengingat di mana mereka benar-benar pergi dan tidak ingat perintah yang menunjukkan informasi itu.
Joe

@ Jo, saya akan menambahkan alias C='cd -P .'daripada set -P, karena untuk symlinks sistem saya tidak keberatan berada di direktori symlink.
Wildcard

@ Kartu Memori - menarik - dapatkah Anda memberi contoh di mana ini membuat perbedaan bagi Anda? Saya hanya berlari help cddan masih tidak mengerti apa -P opsi tidak.
Joe

@ Jomkdir test; ln -s test linktotest; cd linktotest; pwd; cd -P .; pwd
Wildcard

9

Anda dapat menggabungkan fitur pencarian riwayat dan riwayat Bash yang ada. Tekan Ctrl-Runtuk memulai pencarian terbalik tambahan, lalu mulai mengetik bagian jalan yang paling mungkin unik.

Anda dapat terus mengetik huruf hingga Anda kembali ke perintah paling baru yang cdmelibatkan direktori itu, atau Anda dapat menekan Ctrl-Rlagi untuk melompat kembali ke riwayat ke perintah terbaru berikutnya yang cocok dengan apa yang Anda ketikkan sejauh ini.

Saya melakukan ini sepanjang waktu.

Sebenarnya, saya melangkah lebih jauh. Begitu saya mulai menemukan urutan perintah yang layak disimpan dalam sejarah tetapi tidak layak dilakukan ke skrip shell, saya mulai menghubungkannya dengan &&dan ;kombinator sehingga saya dapat membalikkan pencarian substring dari satu perintah panjang itu, tekan Enterdan jalankan seluruh urutan di sekali.

Misalnya, inilah cara saya membangun dan menjalankan salah satu program saya selama pengembangan:

$ ( cd .. ; make install ) && ./start_my_program

Saya melakukan ini dari direktori instal, yang berada di bawah direktori sumber tingkat atas. Dengan membungkus cd, membangun dan menginstal bagian dalam sub-shell, saya memastikan bahwa apa pun yang terjadi selama proses ini, saya kembali ke shell normal saya tanpa ada yang berubah. Hanya jika itu berhasil (&&) saya memulai program yang dibangun dan diinstal. Saya dapat menemukan ini dalam sejarah saya hanya dengan Ctrl-Ritu sta, bahwa menjadi semua yang biasanya saya butuhkan untuk secara unik menemukan urutan perintah ini.

Contoh lain tentang bagaimana saya menggunakan ini adalah urutan yang digunakan untuk membangun RPM untuk program yang sama. Sebagian besar pekerjaan yang membosankan ada di skrip shell, tetapi masih ada beberapa perintah yang biasanya harus saya ketik untuk melakukan semua pekerjaan membangun dan menggunakan RPM yang dibangun, yang sekarang saya jarang harus ketik ulang, karena Bash terus itu dalam sejarah bagiku.

Gabungkan semua ini dengan export HISTSIZE=bignumdan shopt histappenddan Anda baru saja membangun memori perintah gajah.

Solusi lain yang saya kodekan sekali adalah dalam jawaban saya untuk pertanyaan lain di sini . Mungkin harus dirancang untuk tujuan Anda, dan itu hanya menangani cdperintah, sedangkan opsi pencarian riwayat bekerja di mana-mana dan untuk setiap perintah.


6

Saya sendiri gunakan aliasuntuk mempersingkat jalan yang sering saya kunjungi. Anda dapat menempatkan set aliases di Anda bashrc, sehingga bash dapat mengingatnya setiap kali Anda masuk. Dan untungnya bash menambahkan alias ke auto complete.

Saya akan menulis sesuatu seperti ini untuk kasus Anda: alias go-classes="cd ~/repo/www/public/util/classes"


6

Anda mungkin mencari bashmark (di github).
Dari README:

Bashmarks adalah skrip shell yang memungkinkan Anda untuk menyimpan dan melompat ke direktori yang biasa digunakan. Sekarang mendukung penyelesaian tab.


4

Ini sama sekali tidak lengkap atau bukti bodoh, hanya konsep untuk memulai. Dengan menambahkan berikut ini di Anda, ~/.bashrcAnda akan memiliki tiga perintah untuk menambahkan hapus dan daftar bookmark direktori (yang didasarkan pada alias shell, sehingga Anda mendapatkan semacam penyelesaian otomatis juga).

BMFILE=~/.bash.bookmarks
[ -f "$BMFILE" ] && . "$BMFILE"

bmadd() {
    local abm
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    abm="alias $bm='cd \"$(pwd)\"'"

    if grep -q " $bm=" "$BMFILE"; then
        echo "Overwriting existing bookmark $bm"
        bmdel "$bm"
    fi
    echo "$abm" >> "$BMFILE"
    eval "$abm"
    #source "$BMFILE"
}

bmdel() {
    local bms
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    #sed -i.bak "/ $bm=/d" "$BMFILE"
    bms=$(grep -v " $bm=" "$BMFILE")
    echo "$bms" > "$BMFILE"
    unalias "$bm" 2> /dev/null
}

bmlist() {
    sed 's/alias \(.*\)=.cd "\(.*\)".$/\1\t\2/' "$BMFILE" | sort
}

Penggunaannya cukup sederhana. bmadddengan argumen menambahkan alias yang dinamai argumen. Alias ​​ini hanya membuat cd ke direktori yang ditetapkan. Tanpa argumen ia menggunakan dirname saat ini sebagai nama alias. Dengan cara yang sama, bmdelhapus alias jika ada dan bmlistdaftarkan bookmark saat ini.

misalnya

u@h:~ $ cd /usr/share/doc
u@h:/usr/share/doc $ bmadd
u@h:/usr/share/doc $ cd /usr/local/share/
u@h:/usr/local/share $ bmadd lshare
u@h:/usr/local/share $ cd
u@h:~ $ bmlist
doc     /usr/share/doc
lshare  /usr/local/share
u@h:~ $ doc
u@h:/usr/share/doc $ bmdel lshare
u@h:/usr/share/doc $ bmlist
doc     /usr/share/doc
u@h:/usr/share/doc $

4

Saya menemukan kebutuhan yang sama beberapa waktu lalu dan memutuskan untuk mengumpulkan beberapa skrip untuk membantu saya menandai jalur absolut / relatif dan memetakannya ke nama yang lebih pendek yang dapat saya ingat dengan mudah.

Script sangat mudah digunakan dan itu hanya akan membuat fungsi dengan nama pendek yang Anda berikan sebagai alias ke direktori yang ingin Anda lompati. Yang perlu Anda lakukan hanyalah mengetikkan nama pendek itu dan itu akan mengarahkan Anda ke direktori yang ditandai.

Berikut ini tautan ke sumber skrip bookmarker. Ngomong-ngomong, saya menamainya The Bookmarker.

Pemakaian

Setelah diinstal itu cukup sepele untuk digunakan.

Untuk menandai direktori:

$ mark /this/is/a/very/very/looooong/path mydir

Untuk menavigasi ke direktori yang ditandai:

$ mydir

Untuk melihat apa yang ditandai:

$ marks
bin     -> /Users/khafaji/bin
eBooks  -> /Users/khafaji/eBooks

Untuk menghapus direktori yang ditandai:

$ umark myDir

Untuk contoh lebih lanjut, petunjuk pemasangan dll. Lihat dokumentasi yang sangat terperinci .


3

cdargs adalah alat terbaik untuk bookmark direktori.

Untuk contoh penggunaan, lihat bookmark untuk video perintah cd di YouTube.

Contoh Penggunaan

cdargsadalah GUI ncurses sehingga Anda dapat bernavigasi secara visual di dalam shell Anda. Setelah terinstal, Anda mengaturnya di shell yang diberikan dengan sumber skrip shell:

$ source /etc/profile.d/cdargs.sh

Ini memungkinkan beberapa fungsi yang bisa Anda panggil dari shell Anda.

Panggil GUI:

$ cv

Menghasilkan GUI jenis ini:

   [.       ]  /home/saml/tst/88040
 0 [path0   ]  /home/saml/tst/88040/path0
 1 [path1   ]  /home/saml/tst/88040/path1
 2 [path2   ]  /home/saml/tst/88040/path2

Anda dapat menggunakan tombol panah untuk bergerak ke atas dan ke bawah untuk menavigasi daftar. Panah kiri ( ) naik satu tingkat di pohon direktori, panah kanan ( ) akan menelusuri ke dalam direktori.

menandai direktori:

Anda dapat menggunakan cuntuk direktori saat ini Anda menavigasi atau Anda dapat menggunakan auntuk menambahkan direktori yang sedang Anda sorot dengan kursor.

mode operasi:

cdargssedikit mirip vi / vim dalam hal ini di mana ia memiliki gagasan tentang mode . Ada 2 diantaranya, browsing (B) dan listing (L). Anda dapat melihat mode mana yang Anda gunakan melalui tampilan di bagian bawah cangkang Anda.

Mode daftar:

L: /home/saml/tst/88038

Mode penjelajahan:

B: /home/saml/tst/88038

Anda dapat mengubah mode Anda dengan menekan tombol tab (TAB ).

Ini hanya puncak gunung es, lihat halaman manual ( man cdargs) dan juga bantuan bawaan untuk informasi lebih lanjut.


2

Alat terbaik untuk ini adalah: wcd . Saya telah menguji banyak alat lain, dan yang ini digunakan persis seperti yang Anda tanyakan dan lebih baik dalam banyak hal daripada semua solusi sebelumnya.


1

Jawaban lainnya bagus dan spesifik. Cara lain untuk melihatnya adalah dengan menggunakan prosesor makro keyboard yang dapat melakukan hampir semua hal yang dapat Anda pikirkan.

Lihat AutoKey. Ini dapat menggantikan frasa seperti pengolah kata yang benar atau bash history dan juga dapat menjalankan skrip python pada hotkey yang Anda tetapkan yang dapat melakukan hampir semua hal dan juga mengirim penekanan tombol ke perangkat input karakter Anda - sama seperti jika Anda mengetiknya.

Satu - satunya "kekurangan" yang dimilikinya (sehubungan dengan pertanyaan ini) adalah bahwa ia membutuhkan gui untuk menjalankan in - gnome atau kde. Jawaban lain tidak memiliki persyaratan ini.

https://code.google.com/p/autokey/

1

Ada alternatif lain yang disebut z .

Itu belajar pada setiap perubahan direktori:

$ cd /tmp/
$ pwd
/tmp
$ cd
$ pwd
/home/user

Kemudian Anda dapat mengubah ke direktori itu nanti dengan pencocokan fuzzy:

$ z mp
$ pwd
/tmp

1

Apparix adalah alat lain yang melakukan ini. Salah satu fitur yang bermanfaat adalah Anda dapat langsung menuju ke subdirektori dari tanda dan menyelesaikan tab pada sub-direktori tersebut.


0

Solusi lain yang, saya percaya, adalah autojumpdan zsekarang fasd.

Ini melacak direktori mana yang Anda kunjungi dan z dir-nameakan berubah ke direktori dengan namadir-name yang paling sering Anda gunakan. Ini juga memiliki beberapa fungsi untuk file yang sering digunakan.

Anda dapat mengkloningnya dari: https://github.com/clvv/fasd

Menginstal adalah langsung, mengkloning, melakukan instal, dan kemudian memodifikasi .bashrc(atau .zshrcdll) Anda.


0

Anda perlu menambahkan alias ke .bashrcatau .bash_profile.

## navigate to your home directory
$ cd ~
## list the contents of your home directory to see if you have `.bashrc` or `.bash_profile`
$ ls -a 
[`.bashrc` or `.bash_profile` should appear in the list]
## launch the text editor of your choice; I'll use vim here
## if no `~/.bashrc` or `~/.bash_profile`...
$ vim
## if, e.g., `~/.bash_profile` listed...
$ vim ~/.bash_profile

Sekarang, katakanlah Anda ingin pintasan ~/Desktop/Coding/Projects, untuk memanggil yang akan Anda ketik goto_Projs. Anda perlu menambahkan baris berikut ke file yang terbuka di editor teks:

alias goto_Projs='cd ~/Desktop/Coding/Projects'

Sekarang lakukan apa pun yang diinginkan oleh editor teks Anda untuk disimpan (ke /User/<yourusername>/atau ~/tentu saja) dan keluar, dan ketika prompt shell dikembalikan pergi

source ~/.bash_profile

Alias ​​Anda sekarang harus tersedia untuk memanggil seperti yang dijelaskan di atas.


0

Saya menggunakan metode menambahkan komentar di akhir perintah dan kemudian memohon ctrl Runtuk membalikkan pencarian komentar. Ini memiliki keuntungan sebagai berikut:

  • mencari perintah dalam bahasa alami
  • ubah komentar kapan saja dengan cepat dan dapatkan pembaruan terbaru dari ctrl R
  • gunakan ctrl Rdan tabon the fly untuk membuat perubahan kecil pada perintah itu sendiri, sehingga membuat komentar semacam jalan pintas generik ke keluarga perintah serupa
  • tidak diperlukan pengaturan, pemasangan, atau pembukuan :-)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.