cambia directory (cd) ma sostituendo solo una parte del percorso


14

Non sono sicuro che sia possibile, ma mi sembra di ricordare dai miei vecchi tempi usando AIX che era possibile cambiare il mio percorso dicendo semplicemente quale parte del percorso doveva essere sostituita da qualcos'altro. Ad esempio, supponiamo che io abbia due percorsi:

/etc/application-2.0.1/options/default

e

/etc/application-1.0.8/options/default

che potrei passare dalla cartella 1 alla 2 usando un comando simile

cd /2.0.1/1.0.8/

che sostituirà, nel percorso, la stringa 2.0.1a 1.0.8. Ovviamente questo non funziona per me ora. Ma c'è un modo per farlo?

Risposte:


11

Se usi zsh come shell puoi semplicemente entrare cd 1.0.8 2.0.1.


Questa mi sembra l'opzione migliore. Ora vedo come installare quella cosa :)
nathanvda

1
sudo apt-get install zsh
Koushik,

1
La risposta di RandomMonkey consente la funzionalità di sostituzione del percorso completo all'interno del "cd" di Bash incorporato.
kmarsh

9

Questo dovrebbe funzionare in bash su Ubuntu 10.04: cd ${PWD/old/new}. Fondamentalmente questo sostituisce la prima occorrenza di oldnella tua attuale directory di lavoro con new. 2 esempi di seguito.

Esempio 1

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

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

Prendendo in prestito l'idea di sepp2k sopra, potresti fare una funzione come questa

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

e quindi utilizzare qualcosa di simile mycd 2.0.1 1.0.8per passare.


1
Questo è 1/2 via lì. Se guardi la risposta di RandomMonkey, vedrai che tutte le funzionalità sono possibili all'interno del Bash Cd integrato.
kmarsh

8

Ho usato (e perso) questa funzione da solo. Dipende dall'aroma e / o dalla versione di * nix in uso. Se usi bash, ecco un modo pratico per estendere il cd incorporato per includere questa funzionalità. Inseriscilo nel tuo .bashrc (o per testarlo incollalo nella tua shell bash e premi invio).

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

7

Probabilmente stai ricordando l'espansione della storia. Non so cosa fosse disponibile nella tua shell su AIX, ma un modo per farlo in bash è ^2.0.1^1.0.8.

L'espansione della cronologia è meno utile con shell come bash e zsh che hanno un potente editing da riga di comando. È possibile utilizzare i tasti freccia per richiamare i comandi precedenti e Alt+ .per inserire l'ultima parola del comando precedente (premerlo due volte per raggiungere il comando prima di quello e così via).


Devi solo premere Invio la seconda volta se l' histverifyopzione di shoptè attivata.
In pausa fino a ulteriore avviso.

@Dennis: grazie, mi ero dimenticato --norcdurante i test.
Gilles 'SO- smetti di essere malvagio' il

3

Se sei un fan di vi puoi abilitare la modalità vi nella tua shell (bash set -o vi per esempio) e usare la modalità di comando di vi ...

Oppure potresti fare una folle espansione della storia (testata in zsh, forse anche 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

A proposito, l'ho testato in bash e funziona anche lì.
maxschlepzig,

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

Tuttavia questo non è molto carino. Puoi graziarlo un po ', mettendolo in una funzione:

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

E poi chiamandolo come:

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

Tuttavia, devi ancora sfuggire ai punti, ma sono sicuro che questo può essere risolto anche con un po 'di pensiero.


Di certo non è necessario sfuggire ai punti sul lato destro della sostituzione. Nella maggior parte dei casi, non sfuggire ai punti a sinistra sarà anche innocuo, a meno che tu non abbia molte cartelle con nomi simili.
frabjous,

3
 ^2.0.1^1.0.8 

Il comando sopra scambia da 2.0.1 a 1.0.8 nell'ultimo comando, funziona in bash


2

Per assicurarsi che il -P|-L|-lavoro usi quanto segue:

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

Non sono sicuro di AIX, ma lo ricordo come un vecchio trucco della shell Korn sulle scatole di Solaris che gestivo. Nel tuo esempio, dovresti digitare il comando:

cd 2.0.1 1.0.8

Altre informazioni qui .


Questo non ha funzionato per me: Ubuntu 10.04, bash "GNU bash, versione 4.1.5 (1) -release (i486-pc-linux-gnu)", ho provato i seguenti comandi: 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 è un percorso valido.
Koushik,

@koushik: ha scritto che si tratta di un trucco conchiglia Korn. Stai usando bash. bash! = korn. Sotto Ubuntu ksh è disponibile tramite il pacchetto 'ksh'.
maxschlepzig,

opp, mio ​​male. Scusa se l'ho trascurato. @maxschlepzig - grazie per averlo segnalato.
Koushik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.