Pushd ve popd komutlarını nasıl kullanırım?


332

Ne hem pratik kullanımları vardır pushdve popdbiter bu iki komutları kullanarak bir avantajı var cdve cd -?

EDIT : Bu komutların her ikisinin de kullanımına ilişkin bazı pratik örnekler veya dizinleri yığınla tutmanın nedenlerini arıyorum (sekme tamamladığınızda, cd -kısaltmanın takma adlarını cd ..vs.).

Yanıtlar:


304

pushd,, popdve dizin yığınınıdirs değiştirmenize izin veren kabuk yerleşiklerdir . Bu, dizinleri değiştirmek için kullanılabilir, ancak geldiğiniz dizine geri dönün.

Örneğin

aşağıdaki dizinlerle başlayın:

$ ls
dir1  dir2  dir3

dir1 itti

$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir

dirskomut şimdi yığında 2 dizin olduğunu onaylıyor. dir1ve orijinal dir somedir.

../dir3'e bas (çünkü dir1şimdi içerideyiz )

$ pushd ../dir3
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir3

dirsşimdi yığında 3 dizinimiz olduğunu gösteriyor. dir3, dir1ve somedir. Yönüne dikkat edin. Her yeni dizin sola ekleniyor. Dizinleri çıkarmaya başladığımızda soldan da gelecekler.

dizinleri elle değiştir ../dir2

$ cd ../dir2
$ pwd
/home/saml/somedir/dir2
$ dirs
~/somedir/dir2 ~/somedir/dir1 ~/somedir

Şimdi dizinleri açmaya başla

$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1

Geri döndüğümüze dikkat edin dir1.

Tekrar pop ...

$ popd
~/somedir    
$ pwd
/home/saml/somedir

Ve başladığımız yere geri döndük somedir.

Biraz kafa karıştırıcı, ama yığının kafa o anda bulunduğunuz dizindir Olabilir Dolayısıyla biz döndüğümüzde. somedir, Olsa dirsgösterileri bu:

$ dirs
~/somedir

Yığımız infact boş.

$ popd
bash: popd: directory stack empty

19
Teşekkürler, yığın kavramını ve bu komutların nasıl çalıştığını tamamen anlıyorum. Bununla birlikte, yığını dizinlerde tutmak için bazı pratik nedenler arıyorum (sekme tamamladığınızda, cd -kısaltmak için takma adlar cd ..vb.).
syntagma

21
Genellikle b pushd& popdc betiklerinde kullanırım , nereden geldiğimi hatırlamaktan kurtarırlar, sadece popdgeldiğim yerden geri dönmek için her zaman yapabilirim . Genelde popd >/dev/null 2>&1sessiz yapmak için yaparım. Her gün kabuğumda cd kullanırım. Bu makalede ayrıca zaman kazandıran başka ipuçları da var: thegeekstuff.com/2008/10/… .
slm

2
@Garrett - aklıma gelen hiçbiri.
slm

4
@Garrett @slm cd -yalnızca son dizini izlediğinden beri , dizini dahili olarak da değiştiren bir işlevi çağırırsanız, sorun yaşamanın mümkün olacağını hayal ediyorum. Bu durumda, işlev sıfırlamak zorunda kalır - geri almak istediğiniz dizine değil, geçerli dizine. pushd / popd en güvenli yöntemdir. Not: Teorimi test etmedim.
İkili Phile 10:14

5
Neden ilkinden ~/somedir/dir3sonra geri dönmüyorsun popd?
ziyuang

198

Aynı anda birkaç klasörle çalışmak için kullanılabilecek komutlar pushdve gerçekten yararlı bir durum varpopd .

Numaralandırıldığı için yığında kolayca gezinebilirsiniz. Yani, çalışma sırasında emrinizde birkaç çalışma klasörü olabilir.

Aşağıdaki basit bir örneğe bakın.


İlk önce örnek klasör yapısı oluşturalım.

    user@vb:~$ mkdir navigate
    user@vb:~/navigate$ mkdir dir1
    user@vb:~/navigate$ mkdir dir2
    user@vb:~/navigate$ mkdir dir3

Sonra tüm klasörlerinizi yığına ekleyebilirsiniz:

    user@vb:~/navigate$ pushd dir1/
    ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir1$ pushd ../dir2/
    ~/navigate/dir2 ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir2$ pushd ../dir3/
    ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate

Şuna bakabilirsiniz:

    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir2
     2  ~/navigate/dir1
     3  ~/navigate

Güvenli gezinmek için, her zaman yeniden yazılacağından, son (sıfır) klasörü iki kez eklemeniz gerekir:

    user@vb:~/navigate/dir3$ pushd .
    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

Artık bu klasörler arasında dolaşıp, klasörlerin diğer adlarıyla olduğu gibi yığınla çalışabilirsiniz. Sanırım aşağıdaki bölüm kendi kendini açıklayıcı:

    user@vb:~/navigate/dir3$ cd ~4
    user@vb:~/navigate$ dirs -v
     0  ~/navigate
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate$ cd ~3
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate/dir1$ touch text.txt
    user@vb:~/navigate/dir1$ cp text.txt ~2
    user@vb:~/navigate/dir1$ ls ~2
    text.txt
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

Ek ipucu için bazı takma adlar oluşturmaktır dirs -v.

Örneğin:

# In ~/.bashrc
alias dirs="dirs -v"

28
Ve yığını temizleyebilirsinizdirs -c
Jun Murakami

19
Aslında bazı pratik örnekler vermek için +1. Pushd / popd'un man sayfasından ne yaptığını görmek kolaydır, ancak ilk önce dirs ve cd ~ # belirgin değildir.
Scribblemacher

bunun yerine bu tür bir iş akışı için
fasd

bu yüzden daha geçici bir kullanım için bir CDPATH ayarlamaktan daha mı iyidir?
rfabbri

2
@ Jun, bir kerede 3 dizin oluşturmak için "mkdir dir {1,2,3}" var.
Bulat M.

39

Sadece bir cd ile yapamadığınız şeyi dirs stack kullanmak için basit bir kullanım örneği:

pushd .Geçerli dizini XX dirsyığına ekler . Daha sonra, kullanarak cddolaşabilirsiniz ve XX'ye geri dönmek için popd, dizin ağacında ne kadar uzakta olduğunuza bakmaksızın (birden fazla seviyeye, yana doğru vb. Atlayabilirsiniz) bakabilirsiniz. Özellikle bash scriptlerinde faydalıdır.


2
Sanırım en sık yararlandığım özellik bu. Çünkü pushd/ popdbağımsız çalışan cd, onları daha kararlı bir yer işareti olarak kullanabilirsiniz cd -.
Gordon Bean

benim için bu doğru değil. Her cd kullandığımda yığınım değişiyor.
Harendra Singh

oh bu zsh kullanarak coz oldu, ben bash değiştirdiğimde, iyi çalışıyor
Harendra Singh

4
Bu cd ​​-, IMO ile kıyaslamada tek önemli cevaptır. Foo basıp basmadığına gelince; <rastgele dir değiştirme>; popd = foo'dan daha değerlidir; cd $ a; <rastgele dir değiştirme>; cd $ a ... Scriptler için eskiden (pushd) küçük bir sözdizimsel kolaylık görebiliyorum, ancak sonrakinde ([açık] değişkenler) netlikte büyük bir gelişme görüyorum. Etkileşimli bir oturum için, dizin hiyerarşisini ilk önce düzgün bir şekilde organize ettiğimi ve basitçe cd ~ / back / to / obvious / path olarak kaybolduğumu varsayardım.
Jan Kyu Peblik

9

pushdve popdyığındaki dizinleri değiştirmenize izin verir.

Bir pushddizini oluşturduğunuzda, geçerli dizini yığına yerleştirir ve dizini parametre olarak belirtilen dizine değiştirirsiniz.

popd Yığındaki dizine geri dönmenizi sağlar.

Tekrarlarsanız, dizin geçişi korunmuş olur ve kaydedilmiş dizinlere, kaydettiğiniz kayıtların tersi sırayla geri dönebilirsiniz.


6

için bash , temelde: yerine cd birini kullanarak kullanabilirsiniz pushdziyaret dizinleri geçmişi kaydedilir: pratik kullanımı ile, directorys değiştirmek için (doğru: yığılmış) ve bir bunlar arasında geçiş yapabilirsiniz

pushd /home; pushd /var; pushd log

Yığın kullanımını görmek dirsve daha kolay gezinmek için ("Yığın girişlerinin" sayısını bulmak için:

dirs -v

Çıktı:

me@myhost:/home$ dirs -v
 0  /home
 1  /var
 2  /tmp

Şimdi bu sayıları cdve ~benzerleriyle kullanın:

cd ~1

Ancak bu sayılar şimdi yeniden düzenlenmiştir ve "0" konumu değişecektir, bu nedenle pushddizini iki kez üst konuma getirin (veya 0 konumunda kukla kullanın):

me@myhost:/home$ dirs -v
 0  /home
 1  /home
 2  /var
 3  /tmp

şimdi 1..3 orada kalacak

(geçerli dizini yığından serbest bırakmak / geçmiş kullanımdan silmek için popd)


5

Bulduğum pratik bir kullanım, push ve popd kullanarak dizinler arasında geçiş yapmak.

Diyelim ki dir1 ve dir2 iki dizinimiz var ve bazı xyz sebeplerinden dolayı sürekli aralarında geçiş yapmam gerekiyor.

Şu anda iki dizinleri vardır somedir içindeyim dir1ve dir2:

alcohol@alcohol-machine:~/somedir$ ls
dir1  dir2
alcohol@alcohol-machine:~/somedir$ 

Şimdi geçiyorum dir1

alcohol@alcohol-machine:~/somedir$ cd dir1
alcohol@alcohol-machine:~/somedir/dir1$ pwd
/home/alcohol/somedir/dir1

Şimdi dir1yığmaya ekleyeceğim ve geçeceğimdir2

alcohol@alcohol-machine:~/somedir/dir1$ pushd /home/alcohol/somedir/dir2
~/somedir/dir2 ~/somedir/dir1
alcohol@alcohol-machine:~/somedir/dir2$

Gördüğünüz gibi, şimdi elimde dir2ve dir1yığımdayım ve şu anda buradayım dir2.

Şimdi geri dönmek için dir1koşacağım pushd || popd.

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Voila, dir1 içerisindeyim ve yığında dir1 ve dir2 var. Tekrar dir2'ye geçmek için tekrar çalıştırınpushd || popd

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Bu, dizinler arasında geçiş yapmanın basit bir yoludur. Şimdi, ne bilmek istersin, neden dizinler arasında geçiş yapmam gerekiyor? Bir kullanım durumu, web uygulaması üzerinde çalışırken, dosyamı bir dizinde ve günlük dosyalarım başka bir dizinde var. Genellikle uygulamada hata ayıklama yaparken, en son günlükleri kontrol etmek ve bazı değişiklikler yapmak ve uygulamayı oluşturmak için tekrar günlük dizinine geçmek için günlük dizini arasında geçiş yapmam gerekir.


11
(1) soru "avantajları nelerdir sorar pushdve popdüzerinde cd -?" Ne olduğunu tam olarak açıkladığınız gibi, bu soruyu net bir şekilde cevaplamadınız cd -. (2) Söylemenin amacı nedir pushd || popd? Evet, bunun cmdA || cmdBkoşmak demek cmdA, başarısız olursa, koşmak demek olduğunu biliyorum cmdB. Bu bağlamda ne işe yaradığını soruyorum.  pushdargüman olmadan "dizin yığındaki iki öğeyi değiştir" anlamına gelir; Geçerli dizin, dizin yığındaki tek öğe ise başarısız olur. Bu durumda popdda başarısız olur.
G-Man

3
Kimsenin seni sevmediğine inanamıyorum! Cankurtaran! Ne kadar güzel bir kesmek. Teşekkürler. Değiştirilirken, Bence, içinde için kullanım durumunda ve . pushdpopd
Sonny

3
pushd || popdDizinler arasında geçiş yapmak için olduğundan çok daha az yazmayı gerektiren iki farklı yol vardır : pushdhiçbir argüman olmadan bunu yapmaz. cd -açıkça yalnızca son dizine geçmek için var. Ayrıca, soru lehine istedi pushdüzerinde cd -daha yazarak: Bu yanıt açıkça bir dezavantaj başka bir şey sağlarken,.
Benjamin Riggs

Bash'ta, hiçbir argüman olmadan, pushd en üstteki iki dizini değiştirir ve 0 değerini döndürür || popd. Geçiş için neden ihtiyacınız var ? Lütfen açıkla. (Yeterince ittirmedi mi?)
Johnny Wong

@Sonny Sadece cd -iki dizin arasında geçiş yapmak için kullanın . Ek cdolarak hiçbir argüman olmadan giriş dizininize dönersiniz.
Steve

2

Basitçe söylemek gerekirse - 2'den fazla klasör arasında, genellikle birkaç kez ileri geri gezinmek istediğinizde, cd -2 klasörün ötesinde bir şeyle kesmeyeceğiniz için.

Örneğin, tamponunuzun geçmişine bakarak ya da uzun bir yolu tamamlayarak önceki uzun yollarla tekrar gelmeye çalışmak yerine, önemli olanları kolayca üst üste koyarsınız ve gerektiğinde rahatça tek başına sayılarına göre ilerlersiniz. Karmaşık dizin yapıları ve uzun yollar arasında dönen kaygan ve hızlı olur.

Yerleşikler ayrıca, yığınınızı yeniden sipariş etmenize veya artık ihtiyacınız olmayan dizinleri açmanıza izin verir, iş akışınızda esneklik sağlar.

Dizin istifleme, komut dizilerinde de aynı şekilde birkaç dizini kapsayan işlemler için kullanılabilir.


1

Ben dirs / popd / pushd kullanımını biraz rahatsız buldum. Kişisel çözümüm ile tcsh yazdım, aşağıdaki kodu da .alias içine ekleyerek

  foreach b (. , - 0 1 2 3 4 5 6 7 8 9 )
    alias p$b       'set a=`pwd`; echo $a >! ~/.mydir'$b
    alias cd$b      'cd "`cat ~/.mydir'$b'`"'
    alias del$b     'rm -v ~/.mydir'$b
    alias home$b    'set a="~"; echo $a >! ~/.mydir'$b
  end
    alias cdl       'grep / ~/.mydir*'

bu şekilde, örneğin "p" takma adını kullandım. geçerli çalışma dizinini ~ / .mydir dosyasına kaydetmek için. ve "cd" ne zaman ve ne zaman istersem, bu direksiyonu kurtarmak için. "Del". ilgili dosyayı kaldırır; "ev." dizini home dizine ayarlar (cd'ye eşdeğer; p.); "cdl" kaydedilmiş dizinleri listeler. ~ / .Mydir $ b yerine ~ / Dropbox / .mydir $ b (veya başka bir bulut hizmeti gibi) kullanıyorsanız, tercih ettiğiniz dizini farklı hesaplarda ve makinelerde kullanmanın akıllı bir yolunu aldığınızı unutmayın.


0

Bunu bash_profile ve bu gibi .bashrc bu gibi kullanıyorum

vi .bash_profile
alias dirs="dirs -v"
source d.sh
:wq

vi .bashrc
alias dirs="dirs -v"
:wq

vi d.sh
pushd ~/Documents/GIT/seiso-data
pushd ~/Documents/GIT/ewe/EosRegistry
pushd ~/Documents/GIT_LODGING/site-cookbooks
pushd ~/Documents/CHEF_LODGING
pushd  .
:wq

Bu, terminallerimde en son kullanılan dizinler arasında geçiş yapmama yardımcı oluyor. :-) Umarım popd kullanmanıza yardımcı olur, cd ~ stackednumber kullanılır


0

Kullanmak cdve cd -yalnızca en son kullanılan iki dizininiz arasında geçiş yapmanızı sağlar. "Dizin çalışma kümesi" boyutunuz ikidir.

Kullanarak pushd, çalışma kümenizde isteğe bağlı olarak çok sayıda dizin tutabilirsiniz.

Ben pushddaha çok zaman kullanırım cd. Etkin dizinleri bir yığınla oluşturduktan pushd directory_namesonra, bütün gün aralarında geçiş yapabilirsiniz pushd ~#.

pushd dir1
pushd ../dir2
pushd /full/path/to/dir3

# There are now three directories in the stack.

pushd ~3
pushd ~2

# The same three directories are still on the stack, 
# just in a different order.

Kullandığım popdBen o dizini kullanılarak yapılır biliyorum yığından bir dizin kaldırmak istediğiniz yalnızca nadiren.

Dizine git ve yığından kaldır:

popd ~2

Geçerli dizinde kal ve yığından başka bir dizini kaldır:

popd +2

Sonunda, birden fazla terminal penceresinin veya sekmesinin açık olmasına (aktif olarak çalıştığınız her bir dizin için bir tane) ancak hepsinin bir terminalde olmasına benzer bir çalışma stili elde edersiniz. Bu, ekran gayrimenkulünü korur, ayrıca, dizin yollarının tümü tek bir kabukta bulunduğundan, aşağıdakileri yapabilirsiniz:

  • şu anda çalıştığınız dizinler arasında dosya kopyala
  • başka bir dizindeki dosyaları oraya gitmeden görüntüleme veya düzenleme

Örnekler:

cp ~2/myfile.txt ~4
less ~2/myfile.txt

İçinde tcsh(ancak değil bash), dizin yığınınızı bir dosyaya kaydedebilir ve daha sonra geri yükleyebilirsiniz.

Kayıt etmek:

dirs -S ~/dirstack

Onarmak:

dirs -L ~/dirstack

Aksi takdirde, sadece yerini ~de bashsahip örneklerde =kullanılmak üzere tcsh.

pushd =2
popd =4
popd +1

0

Pushd / popd insanlar bence akıl karıştırıcı olan 'dizin yığınını manipüle eden' komutlar olarak tanımlayarak bu komutları tanımlayarak öğretme eğiliminde olduklarından, beni kavramam uzun zaman aldı.

Ona farklı bir şekilde bakıyorum:

pushd [klasör_adı] - [klasör_adı] cd'üne cd olacak ve [klasör_adı] olan hedefi bir yığın yığında belgeleyecek , yığındaki en üstteki dizin ise her zaman içinde bulunduğunuz klasör olacak

popd - ilk önce sizi yığının en üstündeki dizin kaydına cdler ve sonra yığından kaldırır

dirs - Dirt yığınını yazdırır (en soldaki girişin geçerli dizin olduğu dird Db olarak kabul edilebilir (yığının en üstünde)

Yani en popüler 2 kullanım durumu:

Kullanım durumu 1: Pushd ve popd kullanarak gezinme

root@mypc:/main/$ ls
dir1  dir2  dir3  dir4

root@mypc:/main/$ dirs   # prints the current stack
/main

root@mypc:/main/$ pushd dir1    # Will cd to dir1 and document dir1 in dir stack, stack is now:
/main/dir1 /main 
root@mypc:/main/dir1$    # I am now in /main/dir1

root@mypc:/main/dir1$    # Now let's go wild and document whatever I want
root@mypc:/main/dir1$ pushd ../dir2 
root@mypc:/main/dir2$     # Woo I am in /main/dir2
root@mypc:/main/dir2$ pushd ../dir3 
root@mypc:/main/dir3$     # Woo I am in /main/dir3
root@mypc:/main/dir3$ pushd ../dir4 
root@mypc:/main/dir4$     # Woo I am in /main/dir4
root@mypc:/main/dir4$ dirs   # Now dir stack is:
/main/dir4 /main/dir3 /main/dir2 /main/dir1 /main

Diyelim ki yukarıda belgeledim bu klasörlere geri dönmek istediğimden yukarıdakileri yaptım!

El ile cd yaparsam, üst dizin yığını girişini etkileyeceğimi unutmayın (bu, her zaman geçerli dizindir)

root@mypc:/main/dir4$ cd ..   # Now dir stack is:
# (note that /main appear in the leftmost as well which is the top of the stack)
/main /main/dir3 /main/dir2 /main/dir1 /main
root@mypc:/main$ 

Şimdi geriye doğru gidelim:

root@mypc:/main$ popd
root@mypc:/main$     # Still in /main since it was at the top of the dir stack
root@mypc:/main$ dirs    # Stack is now:
/main/dir3 /main/dir2 /main/dir1 /main

root@mypc:/main$ popd
root@mypc:/main/dir3$ popd    # Woo in dir3 now, about to navigate to dir2
root@mypc:/main/dir2$ popd    # Woo in dir2, about to navigate to dir1
root@mypc:/main/dir1$ dirs    # Stack is now:
/main

Yine ne istersem istediğimi belgeleyebilirim ve sonra başka bir dizine manuel olarak gidebilirim, sonra yığına eklediğim belgelenmiş dizine kolayca geri döneceğim.

2. olayı kullanın: Sayısal yığın dizini kullanarak gezinme

Dird dir4 dir3 dir2 dir1 kullanarak şimdi basılan dirv ile şunu göstereyim:

root@mypc:/main$ dirs -v
 0  /main/dir1  (this is the current dir you are in always)
 1  /main/dir2
 2  /main/dir3
 3  /main/dir4

Artık stack dizinini kullanarak dizinleri içeren herhangi bir Linux işlemini yapabilirsiniz:

root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt    # this will run in the background, something like:
# cp /main/dir2/temp.txt  /main/dir3/new_temp.txt

Hatta dir yığınından belirli bir girişi silebilirsiniz:

root@mypc:/main$ popd ~4

"Belgeleme" kelimelerini kullanmanın ya da dir yığınını düşünmenin Db'nin bir tür kavramını basitleştirmesini umuyorum!

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.