Как заставить 'dir/имя файла CD' взять меня к dir/?

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

10
22.05.2013, 16:26
5 ответов

В zsh, Я часто делаю:

cd /path/to/somefile(:h)

(h для head).

Если somefile символьная ссылка, можно также сделать:

cd somefile(:A:h)

Добираться до каталога, где цель символьной ссылки может быть найдена.


zsh эквивалентный из Chris теперь bash- только решение было бы:

cd() {
  [[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
  builtin cd "$@"
}

В zsh, можно также переопределить то, что удаляет Ctrl-W "слов".

В zsh, "слова" в контексте основанного на слове двигаются/транспонируют/удаляют, виджеты являются последовательностями alnums плюс символы в $WORDCHARS переменная, которая по умолчанию включает /.

Вы могли удалить / от $WORDCHARS так, чтобы Ctrl-W только удалил один компонент контура:

WORDCHARS=${WORDCHARS/\/}

Другое полезное расширение select-word-style виджет, который можно использовать для интерактивного выбора между различными стилями слова.

autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style

Затем нажатие Alt-W позволяет Вам выбирать между различными стилями слова.

$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?
5
27.01.2020, 19:59
  • 1
    Интересный. (Я использую zsh также). –  Sébastien 18.05.2013, 12:17
  • 2
    Очень интересное редактирование на питании zsh и стили слова. Спасибо также за zsh команда. Это делает задание отлично. –  Sébastien 22.05.2013, 16:33

Я предполагаю, что Вы все еще хотите сохранить исходную функциональность, если Вы вводите каталог, и Вы используете bash.

cd() {
    local file="${!#}"

    if (( "$#" )) && ! [[ -d "$file" ]]; then
        builtin cd "${@:1:($#-1)}" "${file%/*}"
    else
        builtin cd "$@"
    fi
}

Если Вы никогда не собираетесь использовать опции CD (-P, и т.д.), затем это будет также достаточно:

cd() { 
    if [ -d "$1" ] || [ -z "$1" ]; then
        builtin cd "$@"
    else
        builtin cd "${1%/*}"
    fi
}
15
27.01.2020, 19:59
  • 1
    , если Вы меняете имя функции на CD, удостоверяется, что добавил builtin перед cd –  Ulrich Dangel 17.05.2013, 20:22
  • 2
    @Chris: Вы приняли право ;) Спасибо за это готовое использовать функцию –  Sébastien 18.05.2013, 12:21
  • 3
    Версия, которая сохраняет cd опции не работают с zsh. Более простой хорошо работает с zsh, НО cd больше не эквивалентно как cd ~ :/ –  Sébastien 22.05.2013, 16:24
  • 4
    @Sebastien теперь, я думаю, что это должно зафиксировать это. –  Chris Down 22.05.2013, 17:20
  • 5
    @Chris, действительно включая проверку [ -z "$1" ] было достаточно. Я принял, что ответ Stephane дает ему больше видимости, поскольку это, кажется, лучшее решение для zsh. –  Sébastien 23.05.2013, 11:18

Вы могли использовать dirname разделять имя файла от пути, например.

mycd() { cd "$(dirname "$1")"; }

Посмотрите man dirname.

7
27.01.2020, 19:59
  • 1
    Обратите внимание, что при вводе каталога это изменится на каталог выше того каталога, который не может быть желаем (неясно от вопроса, желаемо ли это или не). –  Chris Down 17.05.2013, 21:08
  • 2
    @ChrisDown Правда, но я оставил это как осуществление читателю и Вашим шоу ответа, как иметь дело с ним. –  Adrian Frühwirth 17.05.2013, 21:10
  • 3
    @AdrianFrühwirth осуществление! Ха! –   17.05.2013, 21:24

Если Вы добавляете это к Вашему .profile, затем загрузите его (source ~/.profile или выйдите из системы и войдите в систему снова), затем mycd [file or directory] возьмет Вас к правильному каталогу:

mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }

Если Вы называете его cd, затем странные вещи произойдут.

3
27.01.2020, 19:59
  • 1
    Это повредится, если имя каталога будет содержать пробел, и Вам нужна заключительная точка с запятой для завершения оперативной группы штаба. Отредактированный это для Вас, надейтесь, что Вы не возражаете. –  Chris Down 17.05.2013, 20:38
  • 2
    @ChrisDown, хотя это верно для других оболочек, Вам не нужна заключительная точка с запятой в zsh. –  Stéphane Chazelas 18.05.2013, 12:42
  • 3
    Кроме того, это повреждается при передаче args к cd, как -P. –  Chris Down 18.05.2013, 14:37
cd2() {
 arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'

 while [ "$#" -gt 1 ] ; do
  case "$1" in
   -h) printf "%s: cd2 %s\n" "$0" "$msg"
    return 1 ;;
   *) arg+=("$1") ;;
  esac
  shift
 done

 [ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
 [ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"

 if ! $cmd 2>/dev/null; then
  printf "%s: cd2 %s\n" "$0" "$msg"
  return 1
 fi
}
0
27.01.2020, 19:59

Теги

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