изменить каталог (cd), но заменив только часть пути


14

Не уверен, что это возможно, но я помню, что с давних времен, используя AIX, можно было изменить мой путь, просто сказав, какую часть пути необходимо заменить чем-то другим. Например, скажем, у меня есть два пути:

/etc/application-2.0.1/options/default

и

/etc/application-1.0.8/options/default

что я мог бы переключиться из папки 1 в 2, используя такую ​​команду, как

кд /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
Кошик

1
Ответ RandomMonkey разрешает полную замену пути в встроенном в Bash «cd».
kmarsh

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

8

Я использовал (и пропустил) эту функцию сам. Это зависит от того, какой вкус и / или выпуск * nix вы используете. Если вы используете bash, вот удобный способ расширить встроенный компакт-диск, чтобы включить эту функцию. Поместите это в ваш .bashrc (или для проверки вставьте его в оболочку bash и нажмите Enter).

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включена.
Приостановлено до дальнейшего уведомления.

@ Денис: спасибо, я забыл --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

Кстати, проверил его в 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/'

Вы все еще должны избежать точек, хотя, но я уверен, что это можно обойти также с небольшим количеством мысли.


Вам, конечно, не нужно избегать точек на правой стороне замены. В большинстве случаев отказ от точек слева также не причинит вреда, если только у вас нет много папок с одинаковыми именами.
2010 г.

3
 ^2.0.1^1.0.8 

Вышеприведенная команда поменяет 2.0.1 на 1.0.8 в последней команде, ее работа в bash


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, но я помню это как старый трюк оболочки Korn на блоках 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- patches / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / network является допустимым путем.
Кошик

@koushik: Он написал, что это уловка Корна. Вы используете Bash. Баш! = Корн. Под Ubuntu ksh доступен через пакет 'ksh'.
maxschlepzig

Оппс, мой плохой. Извините, я упустил это. @maxschlepzig - спасибо за указание.
Кошик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.