Skip to content

Naviguer entre répertoires avec popd, pushd et cd

3 mars 2014

Parfois, il est nécessaire de naviguer entre plusieurs répertoires dont le chemin est long. Certes, les interpréteurs complètent les chemins, ce qui rend les manipulations moins douloureuses. Certes, cd - rend bien service lorsque l’on souhaite simplement revenir dans le répertoire précédent. Cependant, des shells comme Bash ou zsh possèdent une pile dans laquelle il est possible d’enregistrer des chemins pour les réutiliser par la suite. Utiliser cette pile est parfois une solution bien plus pratique.

Les commandes popd et push ne sont pas disponibles dans tous les interprètes de commandes. Par exemple, sh ne les a pas.

Quatres commandes sont nécessaires :

  • popd, pour empiler les répertoires ;
  • pushd, pour dépiler les répertoires ;
  • dirs, pour voir la pile ;
  • cd, pour se déplacer entre les répertoires. Oui, la commande que tout le monde connaît.🙂

Première visite

Empiler un répertoire

Partons d’une pile vide :

chaperonrouge@conte:/$ cd /maison
chaperonrouge@conte:/maison$ dirs -v
0 /maison

dirs affiche uniquement le répertoire actuel (donc /maison, à l’index 0), et rien d’autre car la pile ne possède qu’un seul élément. L’option -v permet d’afficher l’index.

déplacement dans un répertoire

Par défaut, pushd prend un répertoire en paramètre. Il empile ce répertoire, qui est donc à l’index 0. L’ancien répertoire à l’index 0 est décalé à l’index 1. Le nouveau répertoire de travail est donc celui qui est en 0. Enfin, pushd affiche l’état de la nouvelle pile.

Par exemple, en utilisant deux fois la commande pushd sur des répertoires différents :

chaperonrouge@conte:/maison$ pushd /chez/mere/grand
/chez/mere/grand /maison
chaperonrouge@conte:/chez/mere/grand$ dirs -v
0 /chez/mere/grand
1 /maison
chaperonrouge@conte:/chez/mere/grand$ pushd /dans/la/foret
/dans/la/foret /chez/mere/grand /maison
chaperonrouge@conte:/dans/la/foret$ dirs -v
0 /dans/la/foret
1 /chez/mere/grand
2 /maison

Pushd, comportement par défaut

Changer de répertoire

Pour se déplacer vers un répertoire enregistré dans la pile, il suffit de préfixer l’index par le caractère tilde (~). La pile reste inchangée.

Par exemple, chaperonrouge veut aller dans le répertoire /chez/mere/grand qui est actuellement à l’index 1 de la pile :

chaperonrouge@conte:/maison$ dirs -v
0 /dans/la/foret
1 /chez/mere/grand
2 /maison
chaperonrouge@conte:/$ cd ~1
chaperonrouge@conte:/chez/mere/grand$

Déplacement dans un répertoire enregistré dans la pile

Supprimer un répertoire

popd supprime un répertoire de la pile puis affiche le nouvel état de la pile.
Par défaut, popd supprime le premier répertoire de la pile et se déplace vers le répertoire qui est passé à l’index 0.

Par exemple, chaperonrouge décide de faire le ménage :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /en/chemin
2 /dans/la/foret
3 /chez/mere/grand
chaperonrouge@conte:/maison$ popd
/en/chemin /dans/la/foret /chez/mere/grand
chaperonrouge@conte:/en/chemin$ dirs -v
0 /en/chemin
1 /dans/la/foret
2 /chez/mere/grand

Popd, comportement par défaut

Il est aussi possible de supprimer un élément quelconque de la pile en précisant l’index de l’élément à supprimer. Dans ce cas, popd ne change pas le répertoire actuellement utilisé (le chemin enregistré à l’index 0 n’a pas changé).

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
3 /dans/le/ventre/du/loup
chaperonrouge@conte:/maison$ popd +2
/maison /dans/la/foret /dans/le/ventre/du/loup
chaperonrouge@conte:/maison$

Popd (sélection d'un répertoire particulier)

Autres possiblités

L’option -n de pushd permet d’empiler le répertoire passé en paramètre sans se déplacer :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ pushd -n /porte/du/village
0 /maison
1 /porte/du/village
1 /dans/la/foret
2 /chez/mere/grand
/maison /porte/du/village /dans/la/foret /chez/mere/grand
chaperonrouge@conte:/maison$

Pushd, sans déplacement

Mettre le répertoire de travail dans la pile :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ pushd .
/maison /maison /dans/la/foret /chez/mere/grand
chaperonrouge@conte:/maison$

Pushd, empilement du répertoire actuel

L’option -c de dirs vide la pile des répertoires enregistrés :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ dirs -c
chaperonrouge@conte:/maison$ dirs -v
0 /maison

Vider la pile

Il est possible de compter l’index de la pile en partant de la fin (-0 pour le dernier, -1 pour l’avant dernier, etc.). Le comportement est équivalent aux index de liste en Python (et probablement dans beaucoup d’autres langages).

Voici un exemple pour aller dans le dernier répertoire de la pile :

chaperonrouge@conte:/maison$ dirs -v
0 /maison
1 /dans/la/foret
2 /chez/mere/grand
chaperonrouge@conte:/maison$ cd ~-0
chaperonrouge@conte:/chez/mere/grand$

Déplacement dans un répertoire de la pile, comptage par la fin

Les options de ces commandes sont évidemment non exhaustives.

Logiciels utilisés et codes source des schémas

Pour avoir la documentation des commandes, il faut utiliser « man bash » et non « man pushd ».

Le comportement des outils est basé sur Bash, version 4.2.45(1)-release.

Les schémas ont été réalisés avec ditaa, version 0.9. La version utilisée provient du paquet Debian du même nom.
La commande de base à utiliser est :

$ ditaa pushdpopd_exemple1.txt pushdpopd_exemple1.png

Voici le code source des schémas inclus dans l’article :
pushdpopd_exemple1 :

/-------------------\       +-------------+          /-------------------\
| 0 /               |-------: cd /maison  |--------->| 0 /maison         |
\-------------------/       +-------------+          \-------------------/
/-------------------\                                /-------------------\
| cYEL(vide)        |                                | cYEL(vide)        |
\-------------------/                                \-------------------/

pushdpopd_exemple2 :

/-------------------------\      +---------------------------+       /-------------------------\
| 0 /maison               |------: pushd /chez/mere/grand    |------>| 0 /chez/mere/grand      |--+
\-------------------------/      +---------------------------+       \-------------------------/  |
/-------------------------\                                          /-------------------------\  |
| cYEL(vide)              |                                          | cYEL1 /maison           |  |
\-------------------------/                                          \-------------------------/  |
                                                                                                  |
/-------------------------\      +---------------------------+                                    |
| 0 /dans/la/foret        |<-----: pushd /dans/la/foret      |------------------------------------+
\-------------------------/      +---------------------------+
/-------------------------\
| cYEL1 /chez/mere/grand  |
+-------------------------+
| cYEL2 /maison           |
\-------------------------/

pushdpopd_exemple3 :

/-------------------------\       +-------------------------+            /-------------------------\
| 0 /dans/la/foret        |-------: cd ~1                   |----------->| 0 /chez/mere/grand      |
\-------------------------/       +-------------------------+            \-------------------------/
/-------------------------\                                              /-------------------------\
| cYEL1 /chez/mere/grand  |                                              | cYEL1 /chez/mere/grand  |
+-------------------------+                                              +-------------------------+
| cYEL2 /maison           |                                              | cYEL2 /maison           |
\-------------------------/                                              \-------------------------/

pushdpopd_exemple4 :

/-------------------------\       +-------------------------+            /-------------------------\
| 0 /maison               |-------: popd                    |----------->| 0 /en/chemin            |
\-------------------------/       +-------------------------+            \-------------------------/
/-------------------------\                                              /-------------------------\
| cYEL1 /en/chemin        |                                              | cYEL1 /dans/la/foret    |
+-------------------------+                                              +-------------------------+
| cYEL2 /dans/la/foret    |                                              | cYEL2 /chez/mere/grand  |
+-------------------------+                                              \-------------------------/
| cYEL3 /chez/mere/grand  |
\-------------------------/

pushdpopd_exemple5 :

/-------------------------------\       +-----------------------+        /-------------------------------\
| 0 /maison                     |-------: popd  +2              |------->| 0 /maison                     |
\-------------------------------/       +-----------------------+        \-------------------------------/
/-------------------------------\                                        /-------------------------------\
| cYEL1 /dans/la/foret          |                                        | cYEL1 /dans/la/foret          |
+-------------------------------+                                        +-------------------------------+
| cYEL2 /chez/mere/grand        |                                        | cYEL2 /dans/le/ventre/du/loup |
+-------------------------------+                                        \-------------------------------/
| cYEL3 /dans/le/ventre/du/loup |
\-------------------------------/

pushdpopd_exemple6 :

/-------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison               |-------: pushd -n /porte/du/village |-------->| 0 /maison                     |
\-------------------------/       +----------------------------+         \-------------------------------/
/-------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret   |                                              | cYEL1 /porte/du/village       |
+-------------------------+                                              +-------------------------------+
| cYEL2 /chez/mere/grand  |                                              | cYEL2 /dans/la/foret          |
\-------------------------/                                              +-------------------------------+
                                                                         | cYEL3 /chez/mere/grand        |
                                                                         \-------------------------------/

pushdpopd_exemple7 :

/-------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison               |-------: pushd .                    |-------->| 0 /maison                     |
\-------------------------/       +----------------------------+         \-------------------------------/
/-------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret   |                                              | cYEL1 /maison                 |
+-------------------------+                                              +-------------------------------+
| cYEL2 /chez/mere/grand  |                                              | cYEL2 /dans/la/foret          |
\-------------------------/                                              +-------------------------------+
                                                                         | cYEL3 /chez/mere/grand        |
                                                                         \-------------------------------/

pushdpopd_exemple8 :

/-------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison               |-------: dirs -c                    |-------->| 0 /maison                     |
\-------------------------/       +----------------------------+         \-------------------------------/
/-------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret   |                                              | cYEL (vide)                   |
+-------------------------+                                              \-------------------------------/
| cYEL2 /chez/mere/grand  |
\-------------------------/

pushdpopd_exemple9 :

/---------------------------\       +----------------------------+         /-------------------------------\
| 0 /maison              -2 |-------: cd ~-0                     |-------->| 0 /chez/mere/grand            |
\---------------------------/       +----------------------------+         \-------------------------------/
/---------------------------\                                              /-------------------------------\
| cYEL1  /dans/la/foret  -1 |                                              | cYEL1 /dans/la/foret          |
+---------------------------+                                              +-------------------------------+
| cYEL2 /chez/mere/grand -0 |                                              | cYEL2 /chez/mere/grand        |
\---------------------------/                                              \-------------------------------/

From → Autre

Laisser un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :