web-dev-qa-db-fra.com

Comment utiliser les commandes pushd et popd?

Quelles sont les utilisations pratiques de pushd et popd quand il y a un avantage à utiliser ces deux commandes par rapport à cd et cd -?

EDIT : Je recherche des exemples pratiques d'utilisation de ces deux commandes ou des raisons de conserver la pile avec les répertoires (lorsque vous avez terminé la tabulation, cd -, alias pour raccourcir cd .., etc.).

366
syntagma

pushd , popd et dirs sont des commandes internes de Shell qui vous permettent de manipuler le pile de répertoires . Cela peut être utilisé pour changer de répertoire mais revenir au répertoire d'où vous venez.

Par exemple

démarrer avec les répertoires suivants:

$ ls
dir1  dir2  dir3

pushd à dir1

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

La commande dirs confirme que nous avons maintenant 2 répertoires sur la pile. dir1 et le répertoire d'origine, somedir. REMARQUE: Notre répertoire "actuel" est ~/somedir/dir1.

pushd à ../dir3 (parce que nous sommes à l'intérieur dir1 maintenant)

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

dirs montre que nous avons maintenant 3 répertoires dans la pile. dir3, dir1 et somedir. Remarquez la direction. Chaque nouveau répertoire est ajouté à gauche. Lorsque nous commençons à supprimer les répertoires, ils proviendront également de la gauche.

changez manuellement les répertoires en ../dir2

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

Maintenant, commencez à faire apparaître des répertoires

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

Remarquez que nous sommes revenus à dir1.

Pop à nouveau ...

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

Et nous sommes de retour là où nous avons commencé, somedir.

Cela peut être un peu déroutant, mais la tête de la pile est le répertoire dans lequel vous vous trouvez actuellement. Par conséquent, lorsque nous revenons à somedir, même si dirs le montre:

$ dirs
~/somedir

Notre pile est en fait vide.

$ popd
bash: popd: directory stack empty
333
slm

Il y a n cas d'utilisation très utile pour les commandes pushd et popd pour travailler avec plusieurs dossiers simultanément.

Vous pouvez naviguer dans la pile très facilement, car elle est énumérée. Cela signifie que vous pouvez avoir plusieurs dossiers de travail à votre disposition pendant le travail.

Voir un exemple simple ci-dessous.


Commençons par créer un exemple de structure de dossiers.

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

Ensuite, vous pouvez ajouter tous vos dossiers à la pile:

    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

Vous pouvez le rechercher par:

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

Pour naviguer en toute sécurité, vous devez ajouter deux fois le dernier (zéro) dossier, car il sera toujours réécrit:

    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

Maintenant, vous pouvez parcourir ces dossiers et travailler avec la pile comme avec les alias des dossiers. Je suppose que la partie suivante est explicite:

    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

Astuce supplémentaire consiste à créer un alias pour dirs -v.

Par exemple:

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

Un cas d'utilisation simple pour utiliser la pile de répertoires ce que vous ne pouvez pas faire avec un simple CD est:

pushd . ajoute le répertoire courant XX à la pile dirs. Ensuite, vous pouvez vous déplacer en utilisant cd, et pour revenir à XX, il vous suffit de popd quelle que soit la "distance" dans l'arborescence des répertoires (peut sauter sur plusieurs niveaux, latéralement, etc. ). Particulièrement utile dans les scripts bash.

pushd et popd vous permettent de manipuler les répertoires sur la pile.

Lorsque vous pushd un répertoire, vous placez le répertoire courant sur la pile et changez le répertoire en celui spécifié comme paramètre.

popd vous permettra de retourner dans le répertoire de la pile.

Si vous répétez, la traversée du répertoire sera en quelque sorte préservée et vous pouvez revenir aux répertoires enregistrés dans l'ordre inverse de celui dans lequel vous les avez enregistrés.

10
unxnut

pour bash, en gros: au lieu d'utiliser cd on peut utiliser pushd pour changer de répertoire, avec l'usage pratique: l'historique des répertoires visités est sauvegardé (correctement: empilé) et on peut basculer entre eux

pushd /home; pushd /var; pushd log

Pour voir la pile, utilisez dirs et pour une navigation plus facile (pour obtenir les numéros des "entrées de pile", utilisez:

dirs -v

Production:

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

Utilisez maintenant ces chiffres avec cd et ~ comme:

cd ~1

Mais ces nombres sont réorganisés maintenant et la position "0" va changer, donc juste pushd le répertoire à la position supérieure deux fois (ou utilisez un mannequin sur la position 0) comme:

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

maintenant 1..3 gardera sa position

(pour libérer le répertoire actuel de la pile/le supprimer de l'historique, utilisez popd)

8
eli

Une utilisation pratique que j'ai trouvée est de basculer entre les répertoires en utilisant pushd et popd.

Supposons que nous ayons deux répertoires dir1 et dir2 et que je doive basculer entre eux en continu pour une raison xyz.

Actuellement, je suis à somedir qui a deux répertoires dir1 et dir2:

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

Maintenant, je passe à dir1

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

Je vais maintenant ajouter dir1 pour empiler et basculer vers dir2

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

Comme vous pouvez le voir, j'ai maintenant dir2 et dir1 sur la pile et je suis actuellement en dir2.

Revenons maintenant à dir1, Je vais courir pushd || popd.

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

Voila, je suis en dir1 et j'ai dir1 et dir2 sur la pile. Pour revenir à dir2, exécutez à nouveau pushd || popd

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

C'est un moyen simple de basculer entre les répertoires. Maintenant, vous pourriez savoir quoi, pourquoi je dois basculer entre les répertoires? Eh bien, un cas d'utilisation est, lorsque je travaille sur une application Web, j'ai mon fichier make dans un répertoire et mes fichiers journaux dans un autre répertoire. Souvent, lors du débogage de l'application, je dois basculer entre le répertoire des journaux, vérifier les derniers journaux, puis revenir au répertoire make, apporter des modifications et créer l'application.

5
Varun Risbud

Le pushd/popd est un concept si simple qui m'a pris un certain temps à comprendre car les gens ont tendance à l'enseigner en définissant ces commandes comme des commandes qui `` manipulent la pile de répertoires '', ce qui, à mon avis, est très déroutant.

Je le regarde différemment:

pushd [nom_dossier] - CD vers [nom_dossier] et document la destination qui est [nom_dossier] dans une pile dir tandis que le répertoire supérieur de la pile sera toujours le répertoire actuel dans lequel vous vous trouvez

popd - va d'abord vous cd dans l'enregistrement de répertoire qui est au-dessus de la pile puis et supprimez la documentation (supprimez-la de la pile dir)

dirs - Imprime la pile de dir (peut être traitée comme le dir Db où l'entrée la plus à gauche est le répertoire courant (en haut de la pile)

Les 2 cas d'utilisation les plus courants sont donc:

Cas d'utilisation 1: Navigation à l'aide de pushd et popd

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

Disons que j'ai fait ce qui précède car je voudrais revenir aux dossiers que j'ai documentés!

Notez que si je cd manuellement, j'affecterai l'entrée de pile de répertoires supérieure (qui est toujours le répertoire actuel)

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$ 

Revenons maintenant en arrière:

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

Encore une fois, je peux documenter le répertoire que je veux, puis naviguer manuellement vers un autre répertoire, puis je pourrai facilement retourner au répertoire documenté que j'ai inséré dans la pile.

Cas d'utilisation 2: Navigation à l'aide d'un index de pile numérique

Disons que j'ai poussé en utilisant pushd dir4 dir3 dir2 dir1, maintenant exécuter dir -v affichera:

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

Vous pouvez maintenant effectuer n'importe quelle opération Linux impliquant des répertoires à l'aide de l'index de pile:

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

Vous pouvez même supprimer une entrée spécifique de la pile de répertoires:

root@mypc:/main$ popd ~4

J'espère que l'utilisation des mots "documenter" ou penser à la pile de dir comme une sorte de Db simplifie le concept!

4
Mercury

Autrement dit - lorsque vous devez naviguer entre plus de 2 répertoires, généralement plusieurs fois dans les deux sens, comme cd - ne le coupera pas avec autre chose que 2 dossiers.

Ainsi, par exemple, au lieu d'essayer de revenir sur les longs chemins précédents en consultant l'historique de votre tampon ou en complétant un long chemin par onglet, vous empilez simplement les plus importants et si nécessaire, vous y accédez facilement par leur seul numéro. La rotation entre des structures de répertoires complexes et de longs chemins devient fluide et rapide.

Les fonctions intégrées vous permettent également de réorganiser la pile ou de sortir les répertoires dont vous n'avez plus besoin, ce qui permet une flexibilité dans votre flux de travail.

L'empilement de répertoires peut également être utilisé dans des scripts de manière similaire pour des opérations qui s'étendent sur plusieurs répertoires.

3
elig

J'ai trouvé l'utilisation de dirs/popd/pushd un peu inconfortable. J'ai trouvé ma solution personnelle dans tcsh, en ajoutant le code suivant dans .alias

  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*'

de cette façon, j'ai alias, par exemple, "p." pour enregistrer le répertoire de travail actuel dans le fichier ~/.mydir. et "cd". pour récupérer ce répertoire quand et où je veux. "del." supprime le fichier correspondant; "maison." définit le répertoire sur le répertoire d'origine (équivalent à cd; p.); "cdl" répertorie les répertoires enregistrés. Notez que si vous utilisez ~/Dropbox/.mydir $ b (ou tout autre service cloud comme par exemple ownCloud) au lieu de ~/.mydir $ b, vous obtenez un moyen intelligent d'utiliser vos répertoires préférés sur différents comptes et machines.

2
Vitelot

Utilisation de cd et cd - vous permet de basculer uniquement entre vos deux répertoires les plus récemment utilisés. La taille de votre "répertoire de travail" est de deux.

En utilisant pushd, vous pouvez conserver un nombre arbitrairement élevé de répertoires dans votre ensemble de travail.

J'utilise pushd la plupart du temps plutôt que cd. Une fois que vous avez créé une pile de répertoires actifs avec pushd directory_name, vous pouvez ensuite passer d'une journée à l'autre avec 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.

J'utilise popd rarement, uniquement lorsque je veux supprimer un répertoire de la pile lorsque je sais que j'ai fini d'utiliser ce répertoire.

Accédez au répertoire et supprimez-le de la pile:

popd ~2

Restez dans le répertoire actuel et supprimez un autre répertoire de la pile:

popd +2

Vous vous retrouvez avec un style de travail similaire à l'ouverture de plusieurs fenêtres ou onglets de terminal (un pour chaque répertoire dans lequel vous travaillez activement), mais tous dans un terminal. Cela économise de l'espace sur l'écran.En outre, comme les chemins de répertoire sont tous disponibles dans un seul shell, vous pouvez faire des choses comme:

  • copier des fichiers entre les répertoires avec lesquels vous travaillez actuellement
  • afficher ou modifier des fichiers dans un autre répertoire sans y aller

Exemples:

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

Dans tcsh (mais pas bash), vous pouvez même enregistrer votre pile de répertoires dans un fichier et la restaurer ultérieurement.

Sauver:

dirs -S ~/dirstack

Restaurer:

dirs -L ~/dirstack

Sinon, remplacez simplement ~ dans les exemples bash avec = pour une utilisation dans tcsh.

pushd =2
popd =4
popd +1
1
jskroch

Je l'utilise comme ça dans mon bash_profile et .bashrc comme ça

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

cela m'aide à passer d'un répertoire à l'autre le plus récent utilisé sur mon terminal. :-) J'espère que cela vous aide à utiliser pushd plutôt popd j'utilise cd ~ stackednumber

1
Ankur Jain