Bash için “Yer İmleri”


24

Birkaç iç içe dizin katmanında gezinmek genellikle bir acıdır. Firefox'ta yer işaretleri olduğu için kolaydır. Öyleyse bir dosyayı yer imlerine eklemek için ne yapmak isterim:

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

Sonra bu dizine gitmek için şunu yazın:

$ go classes

Daha önce benzer bir şey elde etmek için sembolik bağlar kullandım, ancak ana dizini karıştırmak istemiyorum. Yararlı olabilecek birçok başka özellik var. Örneğin, yazmaya başlamak go clve ardından otomatik tamamlama için sekmeye basmak istiyorum. Bazen teslim alınmış bir havuzun birden fazla kopyası vardır ve bu nedenle programın birden fazla bağlam oluşturmama ve yer imini bağlam taban dizinine göre ayarlamasına izin vermem yararlı olacaktır.

Öyleyse, kendi senaryo setimi birlikte yazmak için yola çıkmadan önce, zaten böyle bir şey var mı?



4
Eğer bash'i firefox'la karşılaştırmaya devam edersen, birisi bash için awesomebar yapacak :(
hhaamu

Yanıtlar:


12

Çok uzun bir süredir bazı yer imleri bulma araçlarını arıyordum ve bulduğum çözümlerden hiç memnun kalmadım.

Ancak, sonunda harika ve evrensel bir araçla karşılaştım: komut satırı bulanık bulucusu .

Öncelikle, dosyaları “bulanık bulma” imkanı sağlar (yukarıdaki bağlantıdaki zengin gif animasyonunu kontrol edin), ancak aynı zamanda isteğe bağlı metin verilerini beslemeye ve bu verileri filtrelemeye izin verir. Yani, kısayol fikri basit: ihtiyacımız olan tek şey yolu olan bir dosyayı tutmak (kısayollar) ve bu dosyayı bulanık olarak filtrelemek. İşte göründüğü gibi: cdgkomut yazıyoruz (isterseniz, "cd global" den), yer imlerimizin bir listesini aldık , sadece birkaç tuşa basarak gerekli olanı seçip Enter tuşuna basın. Çalışma dizini seçilen maddeye değiştirildi:

cdg

Son derece hızlı ve kullanışlıdır: genellikle sadece gerekli öğenin 3-4 harfini giriyorum ve diğerleri zaten filtrelendi. Ek olarak, elbette ok tuşları ile veya Ctrl+j/ ile liste içinde hareket edebiliriz Ctrl+k.

Bu kısayollar / yer imleri çözümü hakkında ayrıntılı makale burada: Kabuğunuz için bulanık kısayollar var .


19

Bence otomatik atlama gibi bir şey arıyorsun . Belirli bir dizinde harcanan zaman miktarıyla ilişkilendirilen bir dizi "anahtar ağırlık" geliştirmek için biraz etrafa cd atmanız gerekir. Daha sonra, bu 'sınıflar' dizininde çok zaman geçirdiğinizi varsayarsanız, oraya doğrudan yazarak gidebilirsiniz.

j cl

Anahtar ağırlıklarınızı "

jumpstat

Geçenlerde biraz daha karmaşık, ancak ilginç ve ilgili bir araç buldumf : github.com/clvv/f
tcdyl

14

Saeedn dediği gibi, takma adlar iyi bir mekanizmadır. Bash kabuk aynı zamanda bir konuma doğru atlamak için yerleşik bir mekanizmaya sahiptir: CDPATH. Öyle ayarlayın PATH, ancak cdprogramları aramak yerine kullanılır .

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

Manpage'den:

   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".

Kendim, bunu gitmek istediğim yere giden bağlantıları olan bir dizinle birleştirdim:

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

Bu, dizinin oldukça doğru görünmediği dezavantajına sahiptir, ancak bu cd -Payar veya ayar kullanılarak düzeltilebilir set -P.


CDPATH ilginç, ancak muhtemelen davranışların her zaman tahmin edilebilir olması için ayrı bir go komutu kullanmaya değer
Casebash

1
-P ayarı için +1. İşaretlerimden bazıları beni deli ediyordu çünkü nereye gittiklerini gerçekten hatırlayamadım ve bu bilgiyi gösteren komutu hatırlamadım.
Joe,

@Joe, alias C='cd -P .'daha ziyade eklerdim, set -Pçünkü sistem sembolik bağları için sembolik link dizininde olmak sorun değil.
Joker

@Wildcard - ilginç - bunun sizin için fark yarattığı bir örnek verebilir misiniz? Koştum help cdve hala -P seçeneğinin ne yaptığını anlamadım.
Joe,

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

9

Bash'in mevcut tarih ve geçmiş arama özelliklerini birleştirebilirsiniz. Ctrl-RArtımlı geriye doğru aramaya başlamak için düğmesine basın , ardından yolun benzersiz olması en muhtemel kısmını yazmaya başlayın.

Bu cddizini içeren en son komutta geri gelinceye kadar harf yazmaya devam edebilir veya Ctrl-Rgeçmişe kadar yazdıklarınızla eşleşen bir sonraki en yeni komuta geri dönmek için tekrar basabilirsiniz .

Bunu her zaman yapıyorum.

Aslında bir adım daha ileri götürüyorum. Ben bir kabuk taahhüdünde komutları dizileri tarihinin korumaya değer ama değmez keşfetmeye başladıktan sonra, ben onları zincirlerle başlamadan &&ve ;combinators ben böylece o bir uzun komut, hit alt dizisiyle için ters aramak Enterve en bütün diziyi çalıştırmak bir Zamanlar.

Örneğin, geliştirme sırasında programlarımdan birini nasıl oluşturup çalıştırıyorum:

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

Bunu, üst düzey kaynak dizininin altındaki yükleme dizininden yapıyorum. cdBir alt kabuğa yapıyı ve parçayı sararak, bu işlem sırasında ne olursa olsun, hiçbir şey değişmeden normal kabuğuma döndüğümden eminim. Ancak bu başarılı olursa (&&), yerleşik ve yüklü programı başlatırım. Ben sadece bir ile benim tarihinin bu bulabilirsiniz Ctrl-Rsonra stabütün Genellikle benzersiz bu komut dizisini bulmalıyız ediliyor ki.

Bunu nasıl kullandığımı gösteren başka bir örnek, aynı program için RPM'lerin oluşturulmasına giden sıradır. Can sıkıcı işlerin çoğu kabuk betiklerinde, ancak nadiren yeniden yazmak zorunda kaldığım yerleşik RPM'leri oluşturmak ve dağıtmak için normalde yazmam gereken bazı komutlar var. benim için tarihte.

Tüm bu birleştirin export HISTSIZE=bignumve shopt histappendve sadece bir fil komut hafızası kurduk.

Bir keresinde yukarı kodlu Başka bir çözüm olduğunu cevabım için burada başka bir soruya . Amaçlarınıza göre uyarlanmış olması gerekebilir ve yalnızca cdkomutları işler ; geçmiş arama seçeneği her yerde ve her komut için çalışır.


6

Kendimi aliassık sık ziyaret ettiğim uzun yolları kısaltmak için kullanıyorum . Sen senin grubu yerleştirebilirsiniz aliasGözlerinde farklı es bashrcbash Onlara giriş her zaman hatırlamak bu yüzden. Ve neyse ki bash, otomatik tamamlama için takma ad ekler.

Davan için böyle bir şey yazarım: alias go-classes="cd ~/repo/www/public/util/classes"


6

Bashmarks ( github'da ) arıyor olabilirsiniz .
README'den:

Bashmarks, sık kullanılan dizinlere kaydetmenizi ve atlamanızı sağlayan bir kabuk betiğidir. Artık sekme tamamlamayı destekliyor.


4

Bu hiçbir şekilde eksiksiz ya da aptal değil, sadece başlamak için bir taslak. Aşağıdakileri ekleyerek, ~/.bashrcsilme ve listeleme dizin imlerini listelemek için üç komutunuz olur (bu, kabuk takma adlarına dayanır, böylece otomatik tamamlama da alırsınız).

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
}

Kullanımı oldukça basit. bmaddBir argüman ile argümandan sonra adlandırılmış bir diğer ad ekler. Bu takma ad yalnızca, içinde bulunduğu dizine bir cd yapar. Bir argüman olmadan, geçerli takma adı takma ad olarak kullanır. Benzer şekilde, bmdelvarsa ve bmlistmevcut yer imlerini listeleyen bir diğer adı siler .

Örneğin

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

Bir süre önce aynı ihtiyaca rastladım ve mutlak / göreceli yolları işaretlememe ve onları kolayca hatırlayabileceğim daha kısa isimlerle eşlememe yardım etmek için birkaç senaryo hazırlamaya karar verdim.

Komutun kullanımı çok kolaydır ve atlamak istediğiniz dizine bir takma ad olarak sağladığınız kısa adı olan bir işlev yaratacaktır. Yapmanız gereken tek şey, bu kısa adı yazmanız yeterlidir ve yer imi dizinine götürür.

İşte bookmarker betiğinin kaynağına bir link . Bu arada, Yer İşareti olarak adlandırdım.

kullanım

Kurulduktan sonra kullanımı oldukça önemsiz.

Bir dizini işaretlemek için:

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

İşaretli bir dizine gitmek için:

$ mydir

Neyin işaretlendiğini görmek için:

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

İşaretli bir dizini silmek için:

$ umark myDir

Diğer örnekler için kurulum talimatları vb. Çok ayrıntılı belgelere bakın .


3

cdargs Dizin yer imi için en iyi araçtır.

Kullanım örnekleri için, YouTube'daki cd komut videosunun yer imlerine bakın .

Örnek Kullanım

cdargsbir ncurses GUI'dir, böylece kabuğunuzun içinde görsel olarak gezinebilirsiniz. Bir kez kurulduktan sonra, bir kabuk betiğini kaynaklayarak belirli bir kabukta kurarsınız:

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

Bu, daha sonra kabuğunuzdan arayabileceğiniz çeşitli işlevleri sağlar.

GUI'yi çağırın:

$ cv

Bu tür bir GUI'de sonuçlanan:

   [.       ]  /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

Listede gezinmek için aşağı ve yukarı hareket etmek için ok tuşlarını kullanabilirsiniz. Sol ok ( ) dizin ağacında bir seviye yükselir, sağ ok ( ) bir dizine iner.

markalama rehberleri:

Gezindiğiniz cgeçerli dizin için kullanabilirsiniz veya aimleçle o anda vurguladığınız dizini eklemek için kullanabilirsiniz .

çalışma modları:

cdargsbu konuda bu mod kavramına sahip olduğu yerde biraz vi / vim gibidir . Bunlardan 2 tanesi, tarama (B) ve listeleme (L). Hangi modda bulunduğunuzu, kabuğunuzun altındaki ekrandan görebilirsiniz.

Liste modu:

L: /home/saml/tst/88038

Tarama modu:

B: /home/saml/tst/88038

Modunuzu sekme tuşuna ( TAB) basarak değiştirebilirsiniz .

Bu buzdağının sadece görünen kısmı, man sayfasına ( man cdargs) ve ayrıca daha fazla bilgi için dahili yardıma danışın .


2

Bunun için en iyi araç şudur: wcd . Diğer birçok aracı test ettim ve bu tam olarak sizin sorduğunuz şekilde kullanılır ve birçok açıdan tüm önceki çözümlerden daha iyidir.


1

Diğer cevaplar mükemmel ve özeldir. Buna bakmanın başka bir yolu, düşünebileceğiniz hemen her şeyi yapabilen bir klavye makro işlemcisi kullanmaktır.

AutoKey'e göz atın. Bir kelime işlemci otomatik düzeltme veya bash geçmişi gibi ifadelerin yerini alabilir ve aynı zamanda tanımladığınız bir kısayol tuşunda bir piton komut dosyası çalıştırabilir; bu da neredeyse her şeyi yapabilir ve aynı zamanda karakter giriş cihazınıza tuş vuruşları gönderebilir.

Sahip olduğu tek “eksiklik” (bu soruya bağlı olarak), gnome veya kde çalışması için bir gui'ye ihtiyaç duymasıdır. Diğer cevapların bu şartı yoktur.

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

1

Z adında başka bir alternatif var .

Her dizin değişikliğini öğrenir:

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

Sonra daha sonra bulanık eşleme ile bu dizine geçebilirsiniz:

$ z mp
$ pwd
/tmp

1

Apparix bunu yapan başka bir araçtır. Yararlı özelliklerinden biri doğrudan işaretin alt dizinlerine atlayabilir ve bu alt dizinlerde sekme tamamlayabilirsiniz.


0

İnanıyorum ki, öyle autojumpve zöyle fasd.

Hangi dizinleri ziyaret ettiğinizi izler ve en sık kullandığınız z dir-nameadla dizine dir-namedönüşür. Ayrıca sık kullanılan dosyalar için bazı işlevlere sahiptir.

Klonlayabilirsiniz: https://github.com/clvv/fasd

Kurulum oldukça basittir, klonlayın, kurun ve ardından .bashrc(veya .zshrcvb.) Değiştirin .


0

Sen senin için bir takma ad eklemeniz gerekir .bashrcveya .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

Şimdi, ~/Desktop/Coding/Projectshangisini yazacağınızı çağırmak için kısayol istediğinizi varsayalım goto_Projs. Metin editöründe açık olan dosyaya aşağıdaki satırı eklemeniz gerekir:

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

Şimdi metin editörünüzün kaydetmenizi ( elbette /User/<yourusername>/veya ~/elbette) yapmak istediğiniz bir şey yapın ve kabuk istemi döndürüldüğünde

source ~/.bash_profile

Takma adınız şimdi yukarıda açıklandığı şekilde çağırmaya hazır olmalıdır.


0

Komutun sonunda bir yorum ekleme yöntemini kullanıyorum ve ardından ctrl Ryorumu tersten aramaya çağırıyorum . Bunun aşağıdaki avantajları vardır:

  • doğal dilde bir komut arayın
  • Anında yorum istediğiniz zaman değiştirin ve en son güncellemeyi alın. ctrl R
  • kullanmak ctrl Rve tabanında dolayısıyla benzer komutların bir aileye yolla jenerik kısayol bir tür haline komuta kendisi bazı küçük özellikler yapmak
  • kurulum, kurulum veya kitap tutmaya gerek yok :-)
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.