Comment puis-je passer au répertoire précédent au lieu de monter?


214

Je passe actuellement beaucoup de temps de travail entre deux chemins très éloignés dans l’arbre et qui se détournent l’un de l’autre à la racine. Il me semble que ma vie serait beaucoup plus facile s'il y avait un argument cdqui conduit l'utilisateur au dernier répertoire dans lequel il se trouvait .

C'est, si je suis dans:

/etc/foo/bar/baz/moo

puis tapez:

cd /var/lib/fubarred_app/blargh/logs

J'aimerais pouvoir retourner au premier répertoire sans avoir à taper à nouveau le chemin complet.

La clé de mémoire ne le coupe pas car j'utilise suffisamment de commandes à chaque endroit pour qu'il soit tout aussi difficile de revenir en arrière et de trouver le chemin que je souhaite que de le taper moi-même.

Existe-t-il une commande courte qui me laisse simplement aller au répertoire précédent?


8
en plus de l' excellente réponse de @ bryan , vous pouvez envisager de créer une paire d'alias pour chaque chemin afin de pouvoir taper quelque chose du type: " bazmoo" ou " blarghlog" à l'invite :)
warren

4
Pourquoi n'utilisez-vous pas simplement l' écran GNU ?
Shi

2
Quelle coquille? Cela fait une énorme différence.
Randal Schwartz

@ Warren Idem. c'est ma façon préférée de tout faire. La moitié de ce que j'utilise avec mon ordinateur a maintenant son propre alias ... =)
ixtmixilix

Fasd est génial. Vérifiez-le.
Majkinetor

Réponses:


301

La commande

cd -

effectuera l’échange dont vous avez besoin sur la plupart des coques classiques, la variante la plus ancienne est

cd "$OLDPWD"

qui utilisera la variable d’environnement contenant le répertoire de travail précédent.


La page de manuel POSIX pour lescd mentions:

LA DESCRIPTION

Si, au cours de l'exécution des étapes ci-dessus, la variable d'environnement PWD est modifiée, la variable d'environnement OLDPWD doit également être remplacée par la valeur de l'ancien répertoire de travail (c'est-à-dire le répertoire de travail actuel immédiatement avant l'appel à cd).

OPERANDS

  -   Lorsqu'un trait d'union est utilisé comme opérande, il doit être équivalent à la commande suivante:

cd "$OLDPWD" && pwd 

qui change dans le répertoire de travail précédent, puis écrit son nom.


7
Gardez à l'esprit que cela dépend vraiment du shell que vous utilisez, et puisque vous n'avez pas spécifié, il serait difficile de donner une réponse "portable" inexistante.
Randal Schwartz

16
@ Randall, vous pourriez peut-être combiner tous vos commentaires de shell dans une réponse Voltron-Shell.
Hyperslug

@ Randall. J'utilisais bash. Cela fonctionne aussi en ksh et zsh. En passant, j'ai d'abord appris à programmer à partir de l'édition de 1994 de Learning Perl, alors excusez-moi pendant que je suis un peu fan. :)
Yitzchak

Hmm, j'ai utilisé cd $OLDPWDpour cela. C'est bien que les coques traditionnelles offrent une forme plus courte.
ulidtko

2
@sinni Certains arômes n'ont , et au moins il est une commande intégrée dans . pushdbash
slhck

105

En plus de la réponse de bryan, il convient de mentionner qu'il existe aussi pushdet popd, qui construisent des répertoires comme une pile. Ceci est également disponible sur Windows NT; Cependant, il n'est pas disponible dans tous les coques.

Par exemple, nous pouvons accéder à trois répertoires différents et vous verrez toujours votre pile lorsque vous appelez pushd:

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

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

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

Et lorsque vous appelez popdtrois fois de suite, vous accédez aux répertoires de la pile dans l’ordre inverse. Dans le même temps, la pile sera à nouveau vidée.

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

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

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

Si vous utilisez Zsh; il a une option AUTO_PUSHD, qui va automatiquement appuyer cdsur sur la pile.


pushd et popd ne sont pas disponibles dans tous les shells.
Randal Schwartz

5
@ Wiesław: vraiment? J'aimerais que Bash ait cela ... Bien sûr, je pourrais faire référence cdà pushd, et ce serait essentiellement la même chose.
Chris Charabaruk

3
Ou alias pd to pushd et avoir les deux. BTW pushd (ou pd, si vous l’aliasez) échange par lui-même le répertoire courant et le dernier répertoire poussé, en accomplissant essentiellement ce que cd - fait.
JRobert

J'aime le concept mais je ne me suis jamais habitué à eux.
Thorbjørn Ravn Andersen

13

Il y a des programmes "jump"

  • autojump (maintenu avec les fonctionnalités de base)
  • j2 (apparemment non maintenu avec certaines fonctionnalités avancées)
  • z (version maintenue de "j" avec fonctionnalités avancées)

Cela facilite tout type de navigation dans les répertoires. Vous l'utilisez en donnant une partie du chemin et cela fonctionne.

Dans ton cas

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

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

Vous pouvez assigner n'importe quelle lettre à ces programmes, "j" est la tradition :)

j2 et z prennent en charge plusieurs termes de recherche, ...

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

... et plus d'options.

~$ 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" est clairement spécifique à la coquille. Tu n'as pas dit ça.
Randal Schwartz

3
@ Randal: Comment est-il spécifique à un shell? C'est un programme.
Fixee

3
Je suis un idiot. :) Je le vois maintenant.
Randal Schwartz

10

En plus cd -etcd $OLDPWD

Vous pouvez utiliser la recherche dans l'historique en appuyant sur CTRL-Rquelques lettres de la cdcommande que vous avez entrée auparavant et en les saisissant . En appuyant à CTRL-Rplusieurs reprises, vous apporterez des matchs plus anciens.

Cette méthode sera plus utile si vous avez plus de deux chemins à modifier.


1
CTRL-R ne va pas nécessairement aider. Vous avez peut-être été dans / some / obscure / directory / deep et avez terminé "cd evendeeperdir" puis vous êtes allé dans ~ / somehere / different.
Justintime

1
Génial! Cela fonctionne pour autre chose qu'une cdaide précieuse!
Niloct

9

Vous pouvez l'utiliser pour créer facilement des alias pour des répertoires:

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

a 1

et ensuite:

1

1
Seulement sur un shell qui comprend les alias et les fonctions. Tous ne le font pas.
Randal Schwartz

alors cela saute la saisie des alias =pièces? hmmmm
Xen2050

6

bashmarks vous permettra de mettre en signet une série de dossiers et de passer d’un dossier à l’autre en complétant les onglets:

Pour marquer un dossier, allez simplement dans ce dossier, puis marquez-le comme ceci:

bookmark foo

Le marque-page s'appellera "foo". Lorsque vous souhaitez revenir à ce dossier, utilisez:

go foo

Pour voir une liste des signets:

bookmarksshow

L’achèvement des onglets fonctionne, pour aller au signet shoobie, simplement:

go sho[tab]

4

Une autre possibilité serait de ne laisser que deux fenêtres ouvertes, avec une à chaque répertoire.


Pas d'historique partagé cependant, si vous utilisez / modifiez les commandes précédentes régulièrement (une réinitialisation les obtiendrait peut-être ...?)
Xen2050

@ Xen2050 Voir l'option shell share_historydans zsh.
Radon Rosborough

4

Je sais que ce n'est pas à proprement parler une réponse à votre question, mais c'est utile pour atteindre l'objectif de vous emmener dans vos répertoires importants .

dans toute descente UNIX-bash, vous pouvez utiliser CDPATH pour étendre le dossier dans lequel la commande cd effectue la recherche.

de mon fichier .bashrc:

export CDPATH='.:~/source/'

cd commence par rechercher dans votre dossier actuel, puis dans mon répertoire projet-codage.

cd myproject

.. me conduit à ~ / sources / myproject d'où que je sois actuellement.

Petite fonctionnalité simple qui a beaucoup aidé ma navigation dans les annuaires.


1
+1 Ceci ajoute le dossier CDPATH à cdla liste de saisie semi-automatique (TAB), ce qui est Bon. Mais si le .n'est pas inclus et s'il existe un dossier dans un dossier CDPATH portant le même nom que celui de votre répertoire actuel, il cd samenameira dans le répertoire CDPATH et non dans celui du répertoire en cours, qui est Bad. cd ./samenameDois utiliser pour entrer dans un dossier dup.
Xen2050

Oui, bon commentaire. Toujours inclure le premier . , ou vous ferez l'expérience d'étranges choses.
phareim

3

Ouais, cd -c'est la voie à suivre mais je m'inquiète du manque de puissance que vous avez dans votre coquille. popdet pushdsont également bons, et cette jchose semble aussi bonne.

Je vais lancer mon propre utilitaire sur le ring ... c'est juste quelque chose que je construis, personnalise et migre avec moi depuis une dizaine d'années et qui fonctionne parfaitement pour ce que je veux.

Publication de blog pour mon utilitaire de gestion d'annuaire

Si cela fonctionne pour vous, génial, mais si cela ne fonctionne pas, promettez-moi, vous obtiendrez autre chose :) Vous ne pouvez tout simplement pas vivre cdseul.


3

Si vous avez seulement 2 répertoires, le moyen le plus simple est, comme mentionné,

cd -

Quand j'ai eu de telles choses dans le passé, j'ai eu quelques astuces que j'ai faites, cela pourrait être utile.

  1. Placez les commandes alias dans le fichier .cshrc, quelque chose comme ceci

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Lien des raccourcis vers les chemins d’intérêt de mon répertoire personnel. Ceci est une chose une fois.

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

Cela permettrait de changer un répertoire aussi facilement que:

   cd ~/moo
   cd ~/blargh

2

Autojump est une commande "cd" de bash / sh / zsh qui, de vos actions, voit cette vidéo .

donc cela vous déplacer à meuh après avoir appris les derniers dossiers

j moo

2

faisceau

J'ai mon propre outil, mais je vais aussi jeter un coup d'œil à l'outil Dereks j.

Bien sûr, le premier choix pour sauter en arrière est

cd -

Mon outil est destiné aux répertoires avec des noms uniques sur les systèmes, où ils locatesont disponibles. il recherche un nom de répertoire correspondant et saute dans la première correspondance:

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

Les dépendances:

  • Localiser
  • grep
  • tête

Désavantages:

  • des répertoires plus récents que la dernière mise à jour -b ne sont pas trouvés
  • Si plusieurs répertoires correspondent, cela dépend de votre chance, de savoir si vous êtes transféré à celui que vous avez en tête.

Améliorations / modifications:

  • au lieu de choisir le premier répertoire, le code peut être modifié pour afficher une liste de choix, invitant l'utilisateur à saisir 1,2,3, ... pour aller à / bin, / usr / bin, / usr / local / bin ...

Usage:

  • mettez la fonction dans votre fichier /etc/bash.bashrc ou ~ / .bashprofile, pour pouvoir l’utiliser facilement.

Avantage de ma solution:

  • non limité à 2 répertoires, comme cd -
  • il n'est pas nécessaire de consulter les répertoires une fois avant d'utiliser le faisceau.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.