ganti direktori (cd) tetapi dengan mengganti bagian dari path saja

14

Tidak yakin apakah itu mungkin, tapi sepertinya saya ingat dari masa lalu saya menggunakan AIX itu mungkin untuk mengubah jalur saya dengan hanya mengatakan bagian mana dari jalur yang perlu diganti oleh sesuatu yang lain. Misalnya, saya punya dua jalur:

/etc/application-2.0.1/options/default

dan

/etc/application-1.0.8/options/default

bahwa saya bisa beralih dari folder 1 ke 2 menggunakan perintah seperti

cd /2.0.1/1.0.8/

yang akan menggantikan, di jalur, string 2.0.1ke 1.0.8. Jelas ini tidak bekerja untuk saya sekarang. Tetapi apakah ada cara untuk melakukan ini?

nathanvda
sumber

Jawaban:

11

Jika Anda menggunakan zsh sebagai shell, Anda cukup memasukkan cd 1.0.8 2.0.1.

qbi
sumber
Ini sepertinya pilihan terbaik bagi saya. Sekarang mencari cara menginstal hal itu :)
nathanvda
1
sudo apt-get install zsh
koushik
1
Jawaban RandomMonkey memungkinkan fungsionalitas penggantian jalur lengkap di dalam "cd" bawaan Bash.
kmarsh
9

Ini harus bekerja di bash di ubuntu 10.04: cd ${PWD/old/new}. Pada dasarnya ini menggantikan kemunculan pertama olddalam direktori kerja Anda saat ini dengan new. 2 contoh di bawah ini.

Contoh 1

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

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

Meminjam gagasan sepp2k di atas, Anda dapat membuat fungsi seperti ini

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

dan kemudian gunakan sesuatu seperti mycd 2.0.1 1.0.8untuk beralih.

koushik
sumber
1
Ini 1/2 jalan ke sana. Jika Anda melihat jawaban RandomMonkey, Anda akan melihat fungsionalitas penuh dimungkinkan dalam Bash Cd bawaan.
kmarsh
8

Saya telah menggunakan (dan melewatkan) fitur ini sendiri. Itu tergantung pada rasa dan / atau rilis * nix yang Anda gunakan. Jika Anda menggunakan bash, berikut adalah cara praktis untuk memperluas cd bawaan untuk menyertakan fungsi ini. Letakkan ini di .bashrc Anda (atau untuk menguji tempel di bash shell Anda dan tekan enter).

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

Anda mungkin mengingat ekspansi sejarah. Saya tidak tahu apa yang tersedia di shell Anda di AIX, tetapi satu cara untuk melakukan ini di bash adalah ^2.0.1^1.0.8.

Ekspansi history kurang berguna dengan shell seperti bash dan zsh yang memiliki pengeditan baris perintah yang kuat. Anda dapat menggunakan tombol panah untuk mengingat perintah sebelumnya, dan Alt+ .untuk memasukkan kata terakhir dari perintah sebelumnya (tekan dua kali untuk mencapai perintah sebelum itu dan seterusnya).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Anda hanya perlu menekan enter untuk kedua kalinya jika histverifyopsi shoptdihidupkan.
Dijeda sampai pemberitahuan lebih lanjut.
@ Dennis: terima kasih, saya sudah lupa --norcsaat pengujian.
Gilles 'SANGAT berhenti menjadi jahat'
3

Jika Anda adalah penggemar vi, Anda dapat mengaktifkan mode vi di shell Anda (bash set -o vi misalnya) dan menggunakan mode perintah vi ...

Atau Anda bisa melakukan ekspansi sejarah yang gila (diuji di zsh, mungkin di bash juga):

$ 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
sumber
Btw, diuji dalam bash dan berfungsi di sana juga.
maxschlepzig
3
cd `pwd | sed 's/2\.0\.1/1\.0\.8/'`

Namun ini tidak terlalu cantik. Anda bisa membuatnya sedikit cantik, dengan meletakkannya di fungsi:

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

Dan kemudian menyebutnya seperti:

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

Anda masih perlu melarikan diri dari titik-titik itu, tetapi saya yakin ini dapat diatasi juga dengan sedikit pemikiran.

sepp2k
sumber
Anda tentu tidak perlu melarikan diri dari titik-titik di sisi kanan substitusi. Dalam kebanyakan kasus, tidak melarikan diri dari titik-titik di sebelah kiri juga tidak akan berbahaya, kecuali Anda memiliki banyak folder dengan nama yang sama.
frabjous
3
 ^2.0.1^1.0.8 

Perintah di atas menukar 2.0.1 ke 1.0.8 di perintah terakhir, kerjanya di bash

SergioAraujo
sumber
2

Untuk memastikan bahwa -P|-L|-pekerjaan menggunakan yang berikut:

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
sumber
1

Tidak yakin tentang AIX, tapi saya ingat ini sebagai trik shell Korn tua pada kotak Solaris yang saya gunakan untuk mengelola. Dalam contoh Anda, Anda akan mengetikkan perintah:

cd 2.0.1 1.0.8

Beberapa info lebih lanjut di sini .

Trieu
sumber
Ini tidak berfungsi untuk saya: ubuntu 10.04, bash "GNU bash, versi 4.1.5 (1) -release (i486-pc-linux-gnu)", saya mencoba perintah berikut: 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 adalah jalur yang valid.
koushik
@koushik: Dia menulis bahwa ini adalah trik shell Korn. Anda menggunakan bash. bash! = korn. Di bawah Ubuntu ksh tersedia melalui paket 'ksh'.
maxschlepzig
opps, salahku. Maaf saya mengabaikan ini. @maxschlepzig - terima kasih telah menunjukkan.
koushik