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

Я обычно использую трюк sudo bash -c, или просто сделаю sudo -s первым, чтобы остаться в корне, а затем запустите команду перенаправления.

Причина, по которой это не работает, заключается в том, что оболочка сначала обрабатывает перенаправление, затем запускает sudo. Поскольку ваша оболочка не имеет доступа к файлу, перенаправление не работает.

12
задан 6 September 2010 в 23:55

99 ответов

Если вы являетесь поклонником vi, вы можете включить режим vi в своей оболочке (например, bash set -o vi) и использовать командный режим vi ...

Или вы могли бы сделать сумасшедшую историю расширение (проверено в zsh, возможно, также в bash):

  $ cd /etc/application-1.0.8/options/default cd: нет такого файла или каталога: / etc / application-  1.0.8 / options / default $ !!: s / 1.0.8 / 2.0.1 / cd /etc/application-2.0.1/options/default cd: нет такого файла или каталога: /etc/application-2.0.1  / options / default  
3
ответ дан 10 August 2018 в 10:51
  cd `pwd |  sed 's / 2 \ .0 \ .1 / 1 \ .0 \ .8 /' ` 

Однако это не очень красиво. Вы можете немного поработать, поставив его в функцию:

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

И затем называть его следующим:

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

Однако вам все равно нужно избегать точек, но я уверен, что с этим можно поработать, подумав немного.

3
ответ дан 13 August 2018 в 17:25
  • 1
    Вам, конечно, не нужно избегать точек с правой стороны замены. В большинстве случаев, не избегая точек слева, тоже будет безвредным, если у вас нет много одинаково названных папок. – frabjous 7 September 2010 в 02:39
  ^ 2.0.1 ^ 1.0.8  

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

3
ответ дан 13 August 2018 в 17:25

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

  cd 2.0.1 1.0.8  

Дополнительная информация здесь .

1
ответ дан 13 August 2018 в 17:25
  • 1
    Это не сработало для меня: ubuntu 10.04, bash "GNU bash, версия 4.1.5 (1) -release (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 7 September 2010 в 17:52
  • 2
    @koushik: Он написал, что это трюк оболочки Korn. Вы используете bash. bash! = korn. В Ubuntu ksh доступен через пакет «ksh». – maxschlepzig 10 September 2010 в 13:22
  • 3
    opps, мой плохой. Извините, я пропустил это. @maxschlepzig - спасибо за указание. – koushik 10 September 2010 в 16:45

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

  function cd () {if [$ # -eq 2];  затем встроенный cd $ {PWD / $ 1 / $ 2};  else builtin cd $ 1;  fi}  
7
ответ дан 13 August 2018 в 17:25

Если вы являетесь поклонником vi, вы можете включить режим vi в своей оболочке (например, bash set -o vi) и использовать командный режим vi ...

Или вы могли бы сделать сумасшедшую историю расширение (проверено в zsh, возможно, также в bash):

  $ cd /etc/application-1.0.8/options/default cd: нет такого файла или каталога: / etc / application-  1.0.8 / options / default $ !!: s / 1.0.8 / 2.0.1 / cd /etc/application-2.0.1/options/default cd: нет такого файла или каталога: /etc/application-2.0.1  / options / default  
3
ответ дан 13 August 2018 в 17:25

Это должно работать в bash на ubuntu 10.04: cd $ {PWD / old / new} . В основном это заменяет первое появление old в вашем текущем рабочем каталоге с новым . 2 примера ниже.

Пример 1

  ing02741 @ hoster: ~ $ cd / home / ing02741 / Видео / 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 выше, вы можете сделать такую ​​функцию

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

, а затем используйте что-то вроде mycd 2.0.1 1.0.8 для переключения.

9
ответ дан 13 August 2018 в 17:25
  • 1
    Это 1/2 пути. Если вы посмотрите на ответ RandomMonkey, вы увидите, что полная функциональность возможна внутри встроенного Bash Cd. – kmarsh 12 January 2017 в 18:32

Чтобы использовать -P | -L | - , используйте следующее:

  function cd () {typeset arg = case $ 1 in - | -L  | -P) arg = $ 1;  сдвиг ;;  esac [$ # -gt 1] & amp; & amp; & amp;  {builtin cd $ arg "$ {PWD / $ 1 / $ 2}"} ||  {builtin cd $ arg "$ @"}}  
0
ответ дан 13 August 2018 в 17:25

Вероятно, вы помните о расширении истории. Я не знаю, что было в вашей оболочке в AIX, но один способ сделать это в bash - ^ 2.0.1 ^ 1.0.8 .

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

7
ответ дан 13 August 2018 в 17:25
  • 1
    Вам нужно нажать только второй раз, если включена опция histverify в shopt . – Dennis Williamson 7 September 2010 в 01:56
  • 2
    @Dennis: спасибо, я забыл - norc при тестировании. – Gilles 7 September 2010 в 02:42

Другие вопросы по тегам:

Похожие вопросы: