змінити каталог (cd), але замінивши лише частину шляху


14

Не впевнений, чи це можливо, але я, мабуть, пам’ятаю зі своїх старих часів за допомогою AIX можна було змінити свій шлях, просто сказавши, яку частину шляху потрібно замінити чимось іншим. Наприклад, скажіть, що у мене є два шляхи:

/etc/application-2.0.1/options/default

і

/etc/application-1.0.8/options/default

що я міг перейти з папки 1 на 2 за допомогою команди типу

cd /2.0.1/1.0.8/

який би замінив на шляху рядок 2.0.1до 1.0.8. Очевидно, це для мене зараз не працює. Але чи є спосіб це зробити?

Відповіді:


11

Якщо ви використовуєте zsh як оболонку, ви можете просто ввести cd 1.0.8 2.0.1.


Це здається мені найкращим варіантом. Тепер дивимось, як встановити цю річ :)
nathanvda

1
sudo apt-get install zsh
koushik

1
Відповідь RandomMonkey дозволяє повністю функціонувати підстановку шляху у вбудованій BD "CD".
кмарш

9

Це повинно працювати в Баш на Ubuntu 10.04: cd ${PWD/old/new}. В основному це замінює перше виникнення oldу вашому теперішньому робочому каталозі на new. 2 приклади нижче.

Приклад 1

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

Приклад 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$ 

Позичивши ідею sepp2k вище, ви можете зробити подібну функцію

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

а потім використовувати щось на кшталт mycd 2.0.1 1.0.8переключення.


1
Це 1/2 шляху туди. Якщо ви подивитесь на відповідь RandomMonkey, то побачите, що повний функціонал можливий у вбудованому Bash Cd.
кмарш

8

Я сам використав (і пропустив) цю функцію. Це залежить від того, який аромат та / або випуск * nix ви використовуєте. Якщо ви використовуєте bash, ось корисний спосіб розширити вбудований компакт-диск, щоб включити цю функціональність. Помістіть це у свій.

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

7

Ви, мабуть, пам’ятаєте розширення історії. Я не знаю, що було доступно у вашій оболонці на AIX, але один із способів зробити це в bash ^2.0.1^1.0.8.

Розширення історії менш корисне для оболонок типу bash та zsh, які мають потужне редагування командного рядка. Ви можете використовувати клавіші зі стрілками для виклику попередніх команд, а Alt+ - .для вставки останнього слова попередньої команди (двічі натисніть її, щоб дістатись до цієї команди тощо).


Вам потрібно лише натиснути клавішу введення, якщо histverifyпараметр shoptувімкнено.
Призупинено до подальшого повідомлення.

@Dennis: дякую, я забув --norcпри тестуванні.
Жил 'ТАК - перестань бути злим'

3

Якщо ви фанат vi, ви можете ввімкнути режим vi в своїй оболонці (наприклад, bash set -o vi) і скористатися командним режимом vi ...

Або ви можете зробити шалене розширення історії (перевірено в zsh, можливо, і в 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, протестував це в bash, і він також працює там.
maxschlepzig

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

Однак це не дуже красиво. Ви можете трохи підібрати його, ввівши його у функцію:

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

А потім називати це так:

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

Вам все одно потрібно уникати крапок, але я впевнений, що над цим можна попрацювати і трохи подумати.


Вам, звичайно, не потрібно уникати крапок з правого боку підстановки. У більшості випадків не вникнути крапок зліва також буде нешкідливим, якщо у вас є безліч папок, названих аналогічно.
frabjous


2

Для забезпечення -P|-L|-роботи використовуйте наступне:

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

Не впевнений у AIX, але я пам’ятаю це як старий трюк оболонки Корна на полях Solaris, якими я керував. У вашому прикладі ви введете команду:

cd 2.0.1 1.0.8

Ще трохи інформації тут .


Для мене це не спрацювало: ubuntu 10.04, bash "GNU bash, версія 4.1.5 (1) -випуск (i486-pc-linux-gnu)", я спробував наступні команди: 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- патчі / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / мережа - допустимий шлях.
кушик

@koushik: Він написав, що це хитрість із Korn shell. Ви використовуєте bash. баш! = корн. Під Ubuntu ksh доступний через пакет 'ksh'.
maxschlepzig

opps, моя погана. Вибачте, що я не помітив цього. @maxschlepzig - дякую, що вказали.
кушик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.