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.).
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.
$ ls
dir1 dir2 dir3
$ 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
.
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.
../dir2
$ cd ../dir2
$ pwd
/home/saml/somedir/dir2
$ dirs
~/somedir/dir2 ~/somedir/dir1 ~/somedir
$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1
Remarquez que nous sommes revenus à dir1
.
$ 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
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"
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.
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
)
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.
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!
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.
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.
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:
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
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