Yukarı gitmek yerine önceki dizine nasıl geçebilirim?


214

Şu anda çalışma saatlerimin çoğunu, ağacın çok altında olan ve birbirinden kökte uzanan iki yol arasında ileri geri hareket ederek geçiriyorum. cdKullanıcıyı içinde bulundukları son dizine götüren bir argüman olsaydı, hayatımın çok daha kolay olacağı beni çok etkiledi .

Bu, eğer öyleysem:

/etc/foo/bar/baz/moo

ve sonra şunu yazın:

cd /var/lib/fubarred_app/blargh/logs

Tüm yolu tekrar yazmak zorunda kalmadan ilk dizine geri dönebilmek istiyorum.

Her yerde yeterince geri kullandığım ve geri almamın ve istediğim yolu kendimin yazması kadar zor olduğu için bellek anahtarı kesmiyor.

Önceki dizine gitmeme izin verecek kısa bir komut var mı?


8
@ bryan'ın mükemmel cevabına ek olarak , her yol için bir çift diğer ad oluşturmayı düşünebilirsiniz, böylece sadece " bazmoo" veya " blarghlog" komut satırında yazabilirsiniz :)
warren

4
Neden sadece GNU ekranını kullanmıyorsun ?
Shi

2
Hangi kabuk? Bu büyük bir fark yaratıyor.
Randal Schwartz

@ warren ditto. bu benim her şeyi yapmak için tercih ettiğim yol. bilgisayarımı kullandığımın yarısının şimdi kendi takma adı var ... =)
ixtmixilix

Fasd harika. Bunu kontrol et.
majkinetor

Yanıtlar:


301

Komuta

cd -

ana kabukların çoğunda ihtiyaç duyduğunuz takas işlemini gerçekleştirir, eski uzun varyant

cd "$OLDPWD"

önceki çalışma dizinini içeren ortam değişkenini kullanacaktır.


İçin POSIX adam sayfasıcd bahseder:

AÇIKLAMA

Yukarıdaki adımların yürütülmesi sırasında, PWD ortam değişkeni değiştirilirse, OLDPWD ortam değişkeni eski çalışma dizininin değeriyle de değiştirilir (bu, cd çağrılmadan hemen önceki geçerli çalışma dizinidir).

İşlenenler

  -   İşlenen olarak bir tire kullanıldığında, bu komutla aynı olacaktır:

cd "$OLDPWD" && pwd 

önceki çalışma dizini değişir ve sonra adını yazar.


7
Bunun gerçekten kullandığınız kabuğa bağlı olduğunu ve belirtmediğiniz için varolmayan "taşınabilir" cevabı vermek zor olacağını unutmayın.
Randal Schwartz

16
@Randall, Belki de tüm bireysel kabuk yorumlarınızı bir Voltron-Shell cevabında birleştirebilirsiniz.
Hiperslug

@Randall. Bash kullanıyordum. Çok ksh ve zsh de çalışır. Bu arada, önce Learning Perl'in 1994 sayısından programlamayı öğrendim, bu yüzden biraz özür dilerim. :)
Yitzchak

Hmm, bunun için kullandım cd $OLDPWD. Yaygın kabukları daha kısa bir formda sunmak güzel.
ulidtko

2
@sinni Bazı tatlar yapmak zorunda pushdve en azından bir yerleşik bulunuyor bash.
slhck

105

Bryan'ın cevabına ek olarak, bir yığın gibi dizinler oluşturan pushdve popdbunun da söz edilmesine değer . Bu, Windows NT'de de mevcuttur; ancak, tüm kabuklarda mevcut değildir.

Örneğin, üç farklı dizine gidebiliriz ve aradığınızda yığınınızı her zaman göreceksiniz pushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

Ve popdarka arkaya üç kez aradığınızda, yığıntaki bu dizinleri ters sırada alırsınız. Aynı zamanda, yığın tekrar boşaltılacaktır.

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Zsh kullanıyorsanız; otomatik olarak yığına itecek bir AUTO_PUSHD seçeneğine sahiptir cd.


Pushd ve popd tüm kabuklarda mevcut değildir.
Randal Schwartz

5
@ Wiesław: Gerçekten mi? Ben bash Tabii ki, ben takma ki ... olsaydı cdetmek pushdve çoğunlukla aynı olurdu.
Chris Charabaruk

3
Veya takma ad pd ve her ikisine de sahip. BTW pushd (veya eğer takma iseniz pd) kendiliğinden geçerli dizini ve en son basılan dizini değiştirerek, aslında 'cd -' işlevini yerine getirir.
JRobert

Kavramı sevdim ama onlara hiç alışmadım.
Thorbjørn Ravn Andersen

13

Bazı "atlama" programları var

  • otomatik atlama (temel özelliklerle korunur)
  • j2 (bazı gelişmiş özelliklerle görünüşte korunmasız)
  • z ("j" versiyonunun gelişmiş özelliklere sahip)

Bunlar her türlü rehber navigasyonunu kolaylaştırır. Yolun bir kısmını vererek onu kullanıyorsunuz ve sadece çalışıyor.

Senin durumunda

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

Bu programlara istediğiniz mektubu atayabilirsiniz, "j" geleneği :)

j2 ve z çoklu arama terimlerini destekler, ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... ve daha fazla seçenek.

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank

2
"j" açıkça kabuğa özgüdür. Bunu söylemedin.
Randal Schwartz

3
@Randal: Kabuğa özgü nasıl? Bu bir program.
Fixee

3
Ben bir aptalım. :) Şimdi anlıyorum.
Randal Schwartz

10

Ek olarak cd -vecd $OLDPWD

Daha önce girdiğiniz komutun CTRL-Rbirkaç harfine basarak ve yazarak geçmiş aramasını kullanabilirsiniz cd. Arka CTRL-Rarkaya basmak eski eşleşmeleri getirir.

Değiştirilecek ikiden fazla yolunuz varsa, bu yöntem daha yararlı olacaktır.


1
CTRL-R mutlaka yardımcı olmaz. Sen / some / müstehcen / dizin / derin ve "cd evendeeperdir" 'i yapmış olabilirsiniz, sonra ~ / somehere / different' a gittiniz.
tam da bu

1
Harika! cdBüyük yardımdan başka şeyler için de işe yarar!
Niloct

9

Bunu dizinlere kolayca takma ad vermek için kullanabilirsiniz:

a() { alias $1=cd\ $PWD; }

a 1

ve sonra:

1

1
Yalnızca takma adları ve işlevleri anlayan bir kabukta. Hepsi değil.
Randal Schwartz

bu alias =parçaları yazmayı atlıyor mu? hmmmm
Xen2050

6

bashmarks , bir dizi klasörü işaretlemenize ve sekme tamamlama ile aralarına atlamanıza izin verir:

Bir klasörü yer imlerine eklemek için, o klasöre gitmeniz ve istediğiniz şekilde yer işaretlemeniz yeterlidir:

bookmark foo

Yer imi "foo" olarak adlandırılacaktır. Bu klasöre geri dönmek istediğinizde:

go foo

Yer imlerinin bir listesini görmek için:

bookmarksshow

Sekme tamamlama, shoobie yer imine gitmek için basitçe çalışır:

go sho[tab]

4

Diğer bir olasılık, her bir dizinde bir tane olacak şekilde sadece iki pencereyi açık tutmak olacaktır.


Paylaşılan geçmiş olsa da, önceki komutları düzenli olarak kullanır / düzenlerseniz (belki bir sıfırlama onları alır mı ...?)
Xen2050

@ Xen2050 share_historyzsh içindeki kabuk seçeneğine bakın .
Radon Rosborough

4

Bunun kesinlikle sorunuza cevap vermediğini biliyorum, ancak sizi önemli dizinlere götürme hedefine ulaşmada yardımcı olur .

Herhangi bir iniş UNIX- bash'ında cd-komutunun aradığı klasörü genişletmek için CDPATH kullanabilirsiniz .

.bashrc dosyamdan:

export CDPATH='.:~/source/'

cd önce geçerli klasörünüzde arama yapar, sonra kodlama-proje-rehberimde arama yapar.

cd myproject

.. beni şu anda durduğum yerden ~ / sources / myproject a götürüyor .

Rehberde gezinmeme çok yardımcı olan basit küçük özellik.


1
+1 Bu, CDPATH klasörünü cd, İyi olan otomatik tamamlama (SEKME) listesine ekler . Ama eğer .dahil değildir ve bir klasör ile CDPATH klasöründe varsa aynı adı geçerli dizinde biri olarak, o zaman cd samenameCDPATH dizin ve gidecek değil Kötü olan geçerli dizinde biri. cd ./samenameDup klasörüne girmek için kullanmak zorunda.
Xen2050

Evet, iyi yorum. Her zaman ilkini dahil et . veya tuhaf şeyler deneyimleyebilirsiniz.
phareim

3

Evet, cd -gitmenin yolu, ama kabuğundaki gücün yetersizliğinden endişeleniyorum. popdve pushdayrıca iyi ve bu jşey de iyi görünüyor.

Kendi yardımcımı ringe atacağım ... bu sadece son 10 yıldır inşa ettiğim, özelleştirdiğim ve taşıdığım bir şeydi ve yapmak istediğim şey için gayet iyi çalışıyor.

Dizin yönetimi yardımcı programım için blog yazısı

Senin için işe yararsa, o zaman harika, ama o zaman bana söz vermezse başka bir şey alacaksın :) Sadece cdyalnız yaşayamazsın .


3

Yalnızca 2 dizininiz varsa, en kolay yol belirtildiği gibi

cd -

Geçmişte böyle şeyler yaşadığımda, yaptığım bir kaç numara vardı, bu yardımcı olabilir.

  1. Alias ​​komutlarını .cshrc dosyasına yerleştirin, bunun gibi bir şey

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Kısayolları ev dizinimdeki ilgi yollarına bağlayın. Bu tek seferlik bir şey.

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

Bu, bir dizinin değiştirilebilmesini kolaylaştıracaktır:

   cd ~/moo
   cd ~/blargh


2

kiriş

Benim kendi aracım var ama Dereks aracına da bir göz atacağım j.

Elbette ileri geri atlama için ilk seçenek

cd -

Aracım, mümkün olduğu yerlerde sistemlerde benzersiz adlara sahip dizinler içindir locate; eşleşen bir dizin adını arar ve ilk eşleşmeye atlar:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

Bağımlılıklar:

  • yerleştirmek
  • grep
  • kafa

Dezavantajları:

  • en son updatedb-run dizininden daha yeni dizinler bulunamadı
  • eğer birden fazla klasör eşleşirse, aklınızdaki ile kiriş edip etmediğinize bağlı olarak şansınıza bağlıdır.

Gelişmeler / modifikasyonlar:

  • İlk dizini seçmek yerine, kod, kullanıcının 1,2,3, ... / bin, / usr / bin, / usr / local / bin konumuna girmesini isteyen bir seçim listesi gösterecek şekilde değiştirilebilir ...

Kullanımı:

  • Fonksiyonu uygun bir şekilde kullanmak için /etc/bash.bashrc veya ~ / .bashprofile dosyasına yerleştirin.

Çözümümün avantajı:

  • 2 dizinle sınırlı değil cd -
  • ışını kullanmadan önce dizinleri bir kez ziyaret etmeniz gerekmez.
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.