zmień katalog (cd), ale zastępując tylko część ścieżki

14

Nie jestem pewien, czy jest to możliwe, ale wydaje mi się, że pamiętam z moich dawnych czasów używania systemu AIX, że mogłem zmienić swoją ścieżkę, po prostu mówiąc, która część ścieżki powinna zostać zastąpiona czymś innym. Powiedzmy, że mam dwie ścieżki:

/etc/application-2.0.1/options/default

i

/etc/application-1.0.8/options/default

że mogę zmienić folder 1 na 2 za pomocą polecenia podobnego

cd /2.0.1/1.0.8/

który zastąpiłby w ścieżce ciąg 2.0.1do 1.0.8. Oczywiście to mi teraz nie działa. Ale czy jest na to sposób?

nathanvda
źródło

Odpowiedzi:

11

Jeśli używasz zsh jako powłoki, możesz po prostu wejść cd 1.0.8 2.0.1.

qbi
źródło
To wydaje mi się najlepszą opcją. Teraz patrzę, jak to zainstalować :)
nathanvda,
1
sudo apt-get install zsh
koushik
1
Odpowiedź RandomMonkey pozwala na pełną funkcję zastępowania ścieżek we wbudowanym „cd” Basha.
kmarsh
9

To powinno działać w bash na ubuntu 10.04: cd ${PWD/old/new}. Zasadniczo ta zastępuje pierwsze wystąpienie oldw obecnym katalogu roboczym z new. 2 przykłady poniżej.

Przykład 1

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

Przykład 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$ 

Pożyczając na pomysł sepp2k powyżej, możesz zrobić taką funkcję

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

a następnie użyj czegoś takiego, mycd 2.0.1 1.0.8aby przełączyć.

koushik
źródło
1
Tam jest 1/2 drogi. Jeśli spojrzysz na odpowiedź RandomMonkey, zobaczysz, że pełna funkcjonalność jest możliwa we wbudowanym Bash Cd.
kmarsh
8

Skorzystałem z tej funkcji (i przeoczyłem ją). Zależy to od używanego smaku i / lub wydania * nix. Jeśli używasz bash, oto przydatny sposób na rozszerzenie wbudowanej płyty CD o tę funkcję. Umieść to w swoim .bashrc (lub w celu przetestowania wklej go do powłoki bash i wciśnij enter).

function cd() { if [ $# -eq 2 ]; then builtin cd ${PWD/$1/$2}; else builtin cd $1; fi }
RandomMonkey
źródło
7

Prawdopodobnie pamiętasz ekspansję historii. Nie wiem, co było dostępne w twojej powłoce w systemie AIX, ale jednym ze sposobów na zrobienie tego w bash jest ^2.0.1^1.0.8.

Ekspansja historii jest mniej przydatna w przypadku powłok takich jak bash i zsh, które mają potężną edycję w linii poleceń. Możesz użyć klawiszy strzałek, aby przywołać poprzednie polecenia, i Alt+, .aby wstawić ostatnie słowo poprzedniego polecenia (naciśnij je dwa razy, aby przejść do polecenia przed nim itd.).

Gilles „SO- przestań być zły”
źródło
Musisz nacisnąć Enter drugi raz, tylko jeśli histverifyopcja shoptjest włączona.
Wstrzymano do odwołania.
@Dennis: dzięki, zapomniałem --norcpodczas testów.
Gilles „SO- przestań być zły”
3

Jeśli jesteś fanem vi, możesz włączyć tryb vi w swojej powłoce (na przykład bash set -o vi) i użyć trybu poleceń vi ...

Lub możesz zrobić szaloną ekspansję historii (testowaną w Zsh, być może także w 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
maxschlepzig
źródło
Btw, przetestowałem to w bashu i również tam działa.
maxschlepzig
3
cd `pwd | sed 's/2\.0\.1/1\.0\.8/'`

Jednak to nie jest bardzo ładne. Możesz to trochę upiększyć, wprowadzając funkcję:

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

A potem nazywając to tak:

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

Nadal jednak musisz uciec przed kropkami, ale jestem pewien, że można to obejść również przy odrobinie namysłu.

sepp2k
źródło
Z pewnością nie musisz uciekać przed kropkami po prawej stronie podstawienia. W większości przypadków nie ucieczka przed kropkami po lewej stronie również będzie nieszkodliwa, chyba że masz wiele folderów o podobnych nazwach.
frabjous
3
 ^2.0.1^1.0.8 

Powyższe polecenie zamienia 2.0.1 na 1.0.8 w ostatnim poleceniu, jego działanie w bash

SergioAraujo
źródło
2

Aby upewnić się, że -P|-L|-praca, użyj następujących czynności:

function cd () {
    typeset arg=
    case $1 in -|-L|-P) arg=$1 ; shift ;; esac
    [ $# -gt 1 ] && {
        builtin cd $arg "${PWD/$1/$2}"
    } || {
        builtin cd $arg "$@"
    }
}
Brett Ryan
źródło
1

Nie jestem pewien co do systemu AIX, ale pamiętam to jako starą sztuczkę powłoki Korna na komputerach Solaris, którymi administrowałem. W twoim przykładzie wpisz polecenie:

cd 2.0.1 1.0.8

Więcej informacji tutaj .

Trieu
źródło
Nie działało to dla mnie: ubuntu 10.04, bash „GNU bash, wersja 4.1.5 (1) -release (i486-pc-linux-gnu)”, próbowałem następujących poleceń: 2048 cd 2049 cd ~ / src / local -ubuntu-patche / 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- łatki / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / network to poprawna ścieżka.
koushik
@koushik: Napisał, że jest to sztuczka powłoki Korna. Używasz bash. bash! = korn. W Ubuntu ksh jest dostępny poprzez pakiet „ksh”.
maxschlepzig,
opps, mój zły. Przepraszam, że przeoczyłem to. @maxschlepzig - dziękuję za zwrócenie uwagi.
koushik