Wechseln Sie das Verzeichnis (cd), indem Sie nur einen Teil des Pfads ersetzen


14

Ich bin mir nicht sicher, ob es möglich ist, aber ich erinnere mich an meine alten Zeiten mit AIX. Es war möglich, meinen Pfad zu ändern, indem ich nur sagte, welcher Teil des Pfades durch etwas anderes ersetzt werden musste. Angenommen, ich habe zwei Pfade:

/etc/application-2.0.1/options/default

und

/etc/application-1.0.8/options/default

dass ich von Ordner 1 nach 2 mit einem Befehl wie wechseln könnte

cd /2.0.1/1.0.8/

was im Pfad die Zeichenkette 2.0.1zu ersetzen würde 1.0.8. Offensichtlich funktioniert das jetzt bei mir nicht. Aber gibt es einen Weg, dies zu tun?

Antworten:


11

Wenn Sie zsh als Shell verwenden, können Sie einfach eingeben cd 1.0.8 2.0.1.


Dies scheint mir die beste Option zu sein. Jetzt schauen, wie man das Ding installiert :)
Nathanvda

1
sudo apt-get install zsh
Koushik

1
RandomMonkeys Antwort ermöglicht die vollständige Pfadersetzungsfunktion in Bashs "CD".
kmarsh

9

Dies sollte 10.04 in bash auf Ubuntu arbeiten: cd ${PWD/old/new}. Grundsätzlich ersetzt dies das erste Vorkommen oldin Ihrem aktuellen Arbeitsverzeichnis durch new. 2 Beispiele unten.

Beispiel 1

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

Beispiel 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$ 

Ausgehend von der obigen Idee von sepp2k könnten Sie eine Funktion wie diese erstellen

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

und dann etwas wie mycd 2.0.1 1.0.8wechseln.


1
Dies ist der halbe Weg dorthin. Wenn Sie sich die Antwort von RandomMonkey ansehen, werden Sie feststellen, dass die Bash Cd-Funktion voll funktionsfähig ist.
kmarsh

8

Ich habe diese Funktion selbst verwendet (und verpasst). Es hängt davon ab, welches Aroma und / oder welche Version von * nix Sie verwenden. Wenn Sie bash verwenden, ist dies eine praktische Möglichkeit, die eingebaute CD um diese Funktionalität zu erweitern. Fügen Sie dies in Ihre .bashrc-Datei ein (oder fügen Sie es zum Testen in Ihre Bash-Shell ein und drücken Sie die Eingabetaste).

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

7

Sie erinnern sich wahrscheinlich an die Erweiterung der Geschichte. Ich weiß nicht, was in Ihrer Shell unter AIX verfügbar war, aber eine Möglichkeit, dies in Bash zu tun, ist ^2.0.1^1.0.8.

Die Verlaufserweiterung ist bei Shells wie bash und zsh mit leistungsstarker Befehlszeilenbearbeitung weniger nützlich. Sie können die Pfeiltasten verwenden, um vorherige Befehle abzurufen, und Alt+ ., um das letzte Wort des vorherigen Befehls einzufügen (zweimal drücken, um zum vorherigen Befehl zu gelangen usw.).


Sie müssen die Eingabetaste nur ein zweites Mal drücken, wenn die histverifyOption von aktiviert shoptist.
Bis auf weiteres angehalten.

@Dennis: danke, ich hatte --norcbeim testen vergessen .
Gilles 'SO- hör auf böse zu sein'

3

Wenn Sie ein vi-Fan sind, können Sie den vi-Modus in Ihrer Shell aktivieren (z. B. bash set -o vi) und den Befehlsmodus von vi ...

Oder Sie könnten eine verrückte Geschichtserweiterung durchführen (getestet in zsh, vielleicht auch in 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

Übrigens, ich habe es in bash getestet und es funktioniert auch dort.
maxschlepzig

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

Dies ist jedoch nicht sehr hübsch. Sie können es ein wenig aufbessern, indem Sie es in eine Funktion einfügen:

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

Und dann heißt es so:

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

Sie müssen den Punkten trotzdem entkommen, aber ich bin sicher, dass dies auch mit ein wenig Nachdenken umgangen werden kann.


Sie müssen den Punkten auf der rechten Seite der Auswechslung nicht entgehen. In den meisten Fällen ist es auch harmlos, die Punkte auf der linken Seite nicht zu umgehen, es sei denn, Sie haben viele Ordner mit ähnlichen Namen.
Frabjous

3
 ^2.0.1^1.0.8 

Der obige Befehl tauscht 2.0.1 gegen 1.0.8 im letzten Befehl, seine Arbeit in der Bash


2

Um dies zu gewährleisten, -P|-L|-verwenden Sie Folgendes:

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

Ich bin mir bei AIX nicht sicher, erinnere mich aber an einen alten Korn-Shell-Trick für die Solaris-Boxen, die ich früher verwaltet habe. In Ihrem Beispiel geben Sie den folgenden Befehl ein:

cd 2.0.1 1.0.8

Weitere Infos hier .


Das hat bei mir nicht geklappt: Ubuntu 10.04, Bash "GNU Bash, Version 4.1.5 (1) -Release (i486-pc-linux-gnu)", ich habe folgende Befehle ausprobiert: 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 ist ein gültiger Pfad.
Koushik

@koushik: Er schrieb, dass es ein Korn-Shell-Trick ist. Sie verwenden Bash. bash! = korn Unter Ubuntu ist ksh über das Paket 'ksh' verfügbar.
maxschlepzig

opps, mein schlimmes. Tut mir leid, dass ich das übersehen habe. @maxschlepzig - danke für den Hinweis.
Koushik
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.