Existe-t-il une commande pour remonter un certain nombre d'étapes dans un répertoire, sans utiliser de cd?

14

Je vais constamment 'cd ../../../../'. Y a-t-il une commande / alias qui pourrait me laisser aller 'cmd 4' et je serais repris 4 répertoires?

studiohack
la source
ls? Tu veux dire sûrement cd?
Chris Jester-Young
Ouais je le fais, je viens de l'écrire à la hâte;) Le modifier maintenant.
Wiil this do?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ
Eh bien, je suppose que je pourrais les écrire pour 1 à 10 environ, mais ce serait bien d'avoir une façon intelligente de le faire. Cela ne me convient pas vraiment. Le fera si aucune autre solution n'apparaît, cependant.

Réponses:

16

Mettez ceci dans votre ~/.bashrc:

cdup() {
  levels=${1-1}
  while ((levels--)); do
    cd ..
  done
}

(Le nom cdupvient de la commande FTP correspondante, juste FYI.)

Chris Jester-Young
la source
Merci pour la réponse, je suis allé avec la réponse de jleedev car elle était plus courte d'une ligne et je ne pouvais pas décider qui choisir! Merci quand même!
@ Muu: Les deux réponses fonctionneront, mais la mienne fonctionnera pour de très nombreux niveaux, et @ jleedev ne fonctionnera que pour une petite poignée (quelle que soit la limite de pile). ;-) (Je suis sûr que vous n'atteindrez jamais la limite de toute façon, mais la mienne est plus générale, c'est ce que j'essaie de comprendre. :-))
Chris Jester-Young
Bon point, je vous ai alors attribué la réponse. Désolé jleedev - bien que je vais probablement continuer à utiliser votre solution car j'oublierai de la changer :)
11

On m'a appris à utiliser «pushd» et «popd» dans de telles circonstances.

Par exemple, tapez «pushd». puis 'cd / home'. Tapez maintenant «popd» et vous serez de retour à l'endroit où vous avez commencé.

'pushd' / 'popd' est une pile, vous pouvez y pousser autant de répertoires que vous le souhaitez, mais c'est le dernier, tout d'abord lorsque vous popdez.

ʍǝɥʇɐɯ
la source
Hm, sympa. Pas entendu parler de ça. Ne correspond pas tout à fait à ce que je cherchais, mais l'utilisera également. Merci.
10

Bien sûr, pourquoi pas:

up () {
    [$ # = 0] && cd .. && retour
    [$ 1 = 0] && retour
    cd .. && up $ (($ 1 - 1))
}
Josh Lee
la source
Bash n'est pas récursif, non? Vous pourriez empiler le débordement si vous le faites up 500. :-)
Chris Jester-Young
6
Si vos répertoires sont imbriqués aussi profondément, vous avez ma sympathie.
Josh Lee
Utilisé ceci. Battre Chris d'une ligne;)
@Muu: Je ne savais pas que cette question était un golf de code! ;-) BTW, venez nous rejoindre! codegolf.stackexchange.com
Chris Jester-Young
3
@Muu N'oubliez pas que la récursivité n'est pas le bon moyen d'écrire des scripts shell en général.
Josh Lee
4

Rapide et sale:

cmd () { dir=.; for i in $(seq 1 $1); do dir=$dir/..; done; pushd $dir; }

Formulé pour ne changer de répertoire qu'une seule fois.

glenn jackman
la source
2

Voici une manière alternative:

function cdup
{
    cd $(for ((i=0 ; i<$1 ;i++)); do printf "../" ; done)
}
jlliagre
la source
1

Vous voudrez peut-être étudier l'utilisation pushdet la popddéfinition de marqueurs d'emplacement et y revenir facilement à partir du répertoire dans lequel vous avez changé.

Vous pouvez également définir une variable avec le nom d'un répertoire que vous utilisez beaucoup, puis y insérer un CD:

MYPROJ=~/projects/name/src
cd $MYPROJ
proj1='cd $MYPROJ'
Caleb
la source
1

J'utilise autojump qui me permet de taper:

j h
>> /home/cjulien
j et
>> /etc

il peut apprendre de vos habitudes et est très léger (et addictif;))

Cédric Julien
la source
1

Construisez le chemin en utilisant printfensuite cdcelui-ci:

cdup() {
    local path
    printf -v path '%*s' "${1:-1}"
    cd "${path// /../}"
}

Utilisé comme:

cdup 4 # to go up four directories
cdup 1 # to explicitly go up one directory
cdup   # to implicitly go up one
évêque
la source
0

Deux réflexions qui pourraient vous être utiles:

  1. cd -
    revenez au dernier répertoire dans lequel vous vous trouviez. Je l'utilise tout le temps pour revenir du plus profond de mon arbre de code à la racine de celui-ci ... bien que cela ne fonctionne que si vous y êtes entré en un seul changement.

  2. cdd old new
    c'était une fonction de script que j'avais écrite dans le passé et que j'utilisais pour me déplacer entre des arbres similaires. Fondamentalement, il a fallu deux arguments et a fait une expression rationnelle sur votre chemin, idéal pour se déplacer entre les branches et autres. Par exemple, si vous étiez dans ~ / bzr / web / trunk / path / to / feature et que vous deviez accéder à ~ / bzr / web / feature-branch / path / to / feature, vous le feriez cdd trunk feature-branch. L'implémentation que j'avais était dans un langage shell archaïque sur AIX, mais c'était assez trivial, donc devrait être facile à implémenter dans le shell de choix si vous en avez besoin. Pour nous, c'était très utile car la structure ressemblait à: ... / {produit} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... donc se déplacer dans cet arbre est devenu fou assez rapidement.

cabbey
la source