thay đổi thư mục (cd) nhưng bằng cách chỉ thay thế một phần của đường dẫn


14

Không chắc là có thể hay không, nhưng dường như tôi nhớ từ ngày xưa khi sử dụng AIX, tôi có thể thay đổi con đường của mình bằng cách chỉ nói phần nào của con đường cần được thay thế bằng thứ khác. Chẳng hạn, giả sử tôi có hai đường dẫn:

/etc/application-2.0.1/options/default

/etc/application-1.0.8/options/default

rằng tôi có thể chuyển từ thư mục 1 sang 2 bằng cách sử dụng một lệnh như

cd /2.0.1/1.0.8/

mà sẽ thay thế, trong đường dẫn, chuỗi 2.0.1đến 1.0.8. Rõ ràng điều này không làm việc cho tôi bây giờ. Nhưng có cách nào để làm điều này?

Câu trả lời:


11

Nếu bạn sử dụng zsh làm shell, bạn chỉ cần nhập cd 1.0.8 2.0.1.


Đây có vẻ là lựa chọn tốt nhất với tôi. Bây giờ hãy tìm cách cài đặt thứ đó :)
nathanvda

1
sudo apt-get install zsh
koushik

1
Câu trả lời của RandomMonkey cho phép chức năng thay thế đường dẫn đầy đủ trong "cd" tích hợp của Bash.
kmarsh

9

Điều này sẽ hoạt động trong bash trên Ubuntu 10.04 : cd ${PWD/old/new}. Về cơ bản, điều này thay thế sự xuất hiện đầu tiên của oldtrong thư mục làm việc hiện tại của bạn vớinew . 2 ví dụ dưới đây.

ví dụ 1

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

Ví dụ 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$ 

Mượn ý tưởng về sepp2k ở trên, bạn có thể thực hiện một chức năng như thế này

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

và sau đó sử dụng một cái gì đó như mycd 2.0.1 1.0.8để chuyển đổi.


1
Đây là 1/2 cách đó. Nếu bạn xem câu trả lời của RandomMonkey, bạn sẽ thấy đầy đủ chức năng có thể có trong Bash Cd tích hợp.
kmarsh

8

Tôi đã sử dụng (và bỏ lỡ) tính năng này bản thân mình. Nó phụ thuộc vào hương vị và / hoặc phát hành * nix bạn đang sử dụng. Nếu bạn sử dụng bash, đây là một cách thuận tiện để mở rộng cd dựng sẵn để bao gồm chức năng này. Đặt cái này trong .bashrc của bạn (hoặc để kiểm tra dán nó vào vỏ bash của bạn và nhấn enter).

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

7

Bạn có thể nhớ mở rộng lịch sử. Tôi không biết những gì có sẵn trong vỏ của bạn trên AIX, nhưng một cách để làm điều này trong bash là^2.0.1^1.0.8 .

Mở rộng lịch sử ít hữu ích hơn với các shell như bash và zsh có khả năng chỉnh sửa dòng lệnh mạnh mẽ. Bạn có thể sử dụng các phím mũi tên để gọi lại các lệnh trước đó và Alt+ .để chèn từ cuối cùng của lệnh trước đó (nhấn hai lần để tiếp cận lệnh trước đó và cứ thế tiếp tục).


Bạn chỉ phải nhấn enter lần thứ hai nếu histverifytùy chọn shoptđược bật.
Tạm dừng cho đến khi có thông báo mới.

@Dennis: cảm ơn, tôi đã quên --norckhi thử nghiệm.
Gilles 'SO- ngừng trở thành ác quỷ'

3

Nếu bạn là người hâm mộ vi, bạn có thể bật chế độ vi trong trình bao của mình (ví dụ: bash set -o vi) và sử dụng chế độ lệnh của vi ...

Hoặc bạn có thể thực hiện mở rộng lịch sử điên rồ (đã thử nghiệm trong zsh, có lẽ là trong 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, đã thử nó trong bash và nó cũng hoạt động ở đó.
maxschlepzig

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

Tuy nhiên điều này không phải là rất đẹp. Bạn có thể nâng nó lên một chút, bằng cách đặt nó vào một hàm:

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

Và sau đó gọi nó như:

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

Mặc dù vậy, bạn vẫn cần phải thoát khỏi các dấu chấm, nhưng tôi chắc chắn rằng điều này có thể được xử lý tốt với một chút suy nghĩ.


Bạn chắc chắn không cần phải thoát khỏi các dấu chấm ở phía bên phải của sự thay thế. Trong hầu hết các trường hợp, việc không thoát khỏi các dấu chấm bên trái cũng sẽ vô hại, trừ khi bạn có rất nhiều thư mục có tên tương tự.
frabjous

3
 ^2.0.1^1.0.8 

Lệnh trên hoán đổi 2.0.1 thành 1.0.8 trong lệnh cuối cùng, công việc của nó trong bash


2

Để đảm bảo rằng -P|-L|-công việc sử dụng như sau:

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

Không chắc chắn về AIX, nhưng tôi nhớ đây là một thủ thuật vỏ Korn cũ trên các hộp Solaris mà tôi đã sử dụng để quản lý. Trong ví dụ của bạn, bạn nhập lệnh:

cd 2.0.1 1.0.8

Một số thông tin thêm ở đây .


Điều này không hiệu quả với tôi: ubfox 10.04, bash "GNU bash, phiên bản 4.1.5 (1) -release (i486-pc-linux-gnu)", tôi đã thử các lệnh sau: 2048 cd 2049 cd ~ / src / local -ubfox-patch / cdtest / dir-v1.0.9 / gnome-control-centre-2.30.1 / capplets / network / 2050 cd dir-v1.2.9 dir-v1.0.9 / home / ing02741 / src / local-ub Ubuntu- các bản vá / cdtest / dir-v1.2.9 / gnome-control-centre-2.30.1 / capplets / mạng là một đường dẫn hợp lệ.
koushik

@koushik: Anh ấy viết rằng đó là trò lừa vỏ Korn. Bạn đang sử dụng bash. bash! = korn. Trong Ubuntu ksh có sẵn thông qua gói 'ksh'.
maxschlepzig

opps, xấu của tôi. Xin lỗi tôi đã bỏ qua điều này. @maxschlepzig - cảm ơn bạn đã chỉ ra.
koushik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.