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?

Odpowiedzi:


11

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


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ć.


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 }

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.).


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

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.


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


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 "$@"
    }
}

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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.