changer de répertoire (cd) mais en remplaçant seulement une partie du chemin


14

Je ne sais pas si c'est possible, mais je semble me souvenir de mes vieux jours avec AIX, il était possible de changer mon chemin en disant simplement quelle partie du chemin devait être remplacée par autre chose. Par exemple, disons que j'ai deux chemins:

/etc/application-2.0.1/options/default

et

/etc/application-1.0.8/options/default

que je pouvais passer du dossier 1 à 2 en utilisant une commande comme

cd /2.0.1/1.0.8/

qui remplacerait, dans le chemin, la chaîne 2.0.1à 1.0.8. Évidemment, cela ne fonctionne pas pour moi maintenant. Mais existe-t-il un moyen de le faire?

Réponses:


11

Si vous utilisez zsh comme shell, vous pouvez simplement entrer cd 1.0.8 2.0.1.


Cela me semble la meilleure option. Maintenant, regardez comment installer cette chose :)
nathanvda

1
sudo apt-get install zsh
koushik

1
La réponse de RandomMonkey permet la fonctionnalité de substitution de chemin complète dans le "cd" intégré de Bash.
kmarsh

9

Cela devrait fonctionner en bash sur ubuntu 10.04: cd ${PWD/old/new}. Fondamentalement, cela remplace la première occurrence de olddans votre répertoire de travail actuel par new. 2 exemples ci-dessous.

Exemple 1

ing02741@hoster:~$ cd /home/ing02741/Videos/
ing02741@hoster:~/Videos$ cd ${PWD/ing02741/koushik}
ing02741@hoster:/home/koushik/Videos$ 

Exemple 2

ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1 dir-v2.2.2 dir-v3.0.7
ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1/ind dir-v2.2.2/ind dir-v3.0.7/ind
ing02741@hoster:~/src/cdtest$ cd dir-v1.0.1/ind/
ing02741@hoster:~/src/cdtest/dir-v1.0.1/ind$ cd ${PWD/1.0.1/2.2.2}
ing02741@hoster:~/src/cdtest/dir-v2.2.2/ind$ 

Empruntant à l'idée de sepp2k ci-dessus, vous pourriez créer une fonction comme celle-ci

function mycd { cd ${PWD/$1/$2} }

puis utilisez quelque chose comme mycd 2.0.1 1.0.8pour basculer.


1
C'est à mi-chemin. Si vous regardez la réponse de RandomMonkey, vous verrez que toutes les fonctionnalités sont possibles dans le Bash Cd intégré.
kmarsh

8

J'ai moi-même utilisé (et manqué) cette fonctionnalité. Cela dépend de la saveur et / ou de la version de * nix que vous utilisez. Si vous utilisez bash, voici un moyen pratique d'étendre le cd intégré pour inclure cette fonctionnalité. Mettez-le dans votre .bashrc (ou pour le tester, collez-le dans votre shell bash et appuyez sur Entrée).

function cd() { if [ $# -eq 2 ]; then builtin cd ${PWD/$1/$2}; else builtin cd $1; fi }

7

Vous vous souvenez probablement de l'expansion de l'histoire. Je ne sais pas ce qui était disponible dans votre shell sur AIX, mais une façon de le faire dans bash est ^2.0.1^1.0.8.

L'expansion de l'historique est moins utile avec des shells comme bash et zsh qui ont une puissante édition en ligne de commande. Vous pouvez utiliser les touches fléchées pour rappeler les commandes précédentes et Alt+ .pour insérer le dernier mot de la commande précédente (appuyez deux fois pour accéder à la commande précédente et ainsi de suite).


Vous n'avez qu'à appuyer sur Entrée la deuxième fois si l' histverifyoption de shoptest activée.
pause jusqu'à nouvel ordre.

@Dennis: merci, j'avais oublié --norclors des tests.
Gilles 'SO- arrête d'être méchant'

3

Si vous êtes un fan de vi, vous pouvez activer le mode vi dans votre shell (bash set -o vi par exemple) et utiliser le mode de commande de vi ...

Ou vous pouvez faire une extension de l'histoire folle (testée en zsh, peut-être aussi en bash):

$ cd /etc/application-1.0.8/options/default
cd: no such file or directory: /etc/application-1.0.8/options/default

$ !!:s/1.0.8/2.0.1/
cd /etc/application-2.0.1/options/default
cd: no such file or directory: /etc/application-2.0.1/options/default

Btw, je l'ai testé en bash et ça marche aussi.
maxschlepzig

3
cd `pwd | sed 's/2\.0\.1/1\.0\.8/'`

Mais ce n'est pas très joli. Vous pouvez l'agrandir un peu, en le mettant dans une fonction:

function mycd { cd `pwd | sed s$1` }

Et puis l'appeler comme:

mycd '/2\.0\.1/1.0.8/'

Vous devez toujours échapper aux points, cependant, mais je suis sûr que cela peut également être résolu avec un peu de réflexion.


Vous n'avez certainement pas besoin d'échapper aux points sur le côté droit de la substitution. Dans la plupart des cas, ne pas échapper aux points de gauche sera également inoffensif, à moins que vous n'ayez beaucoup de dossiers portant le même nom.
frabjous

3
 ^2.0.1^1.0.8 

La commande ci-dessus échange 2.0.1 à 1.0.8 dans la dernière commande, son travail dans bash


2

Pour vous assurer que le -P|-L|-travail utilise les éléments suivants:

function cd () {
    typeset arg=
    case $1 in -|-L|-P) arg=$1 ; shift ;; esac
    [ $# -gt 1 ] && {
        builtin cd $arg "${PWD/$1/$2}"
    } || {
        builtin cd $arg "$@"
    }
}

1

Je ne suis pas sûr d'AIX, mais je m'en souviens comme d'une vieille astuce de shell Korn sur les boîtes Solaris que j'avais l'habitude d'administrer. Dans votre exemple, vous devez taper la commande:

cd 2.0.1 1.0.8

Plus d'infos ici .


Cela n'a pas fonctionné pour moi: ubuntu 10.04, bash "GNU bash, version 4.1.5 (1) -release (i486-pc-linux-gnu)", j'ai essayé les commandes suivantes: 2048 cd 2049 cd ~ / src / local -ubuntu-patches / cdtest / dir-v1.0.9 / gnome-control-center-2.30.1 / capplets / network / 2050 cd dir-v1.2.9 dir-v1.0.9 / home / ing02741 / src / local-ubuntu- patches / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / network est un chemin valide.
koushik

@koushik: Il a écrit que c'était une astuce shell Korn. Vous utilisez bash. bash! = korn. Sous Ubuntu, ksh est disponible via le package 'ksh'.
maxschlepzig

opps, mon mauvais. Désolé d'avoir oublié ça. @maxschlepzig - merci de l'avoir signalé.
koushik
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.