dir/に移動するために `cd dir/filename`をどのように取得しますか?

dir/に移動するために `cd dir/filename`をどのように取得しますか?

私はこれができることがわかりましたcd文書議論。

cd myDirectory/anyname.anyExtension と同等だろう cd myDirectory/

この動作を実装するのに最適なエイリアスや関数は何ですか?

編集する:申し訳ありませんが、最初は言及しませんでした:私は使用します。zsh

答え1

ディレクトリを入力して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
}

答え2

dirnameたとえば、次のようにパスからファイル名を削除できます。

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

望むよりman dirname

答え3

では、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単語ベースの移動/転置/削除ウィジェットの文脈では、「単語」は基本的に含まれる一連$WORDCHARSの数値と変数の文字です/

1つのパスコンポーネントのみが削除されるように、/次から削除できます。$WORDCHARSCtrl-W

WORDCHARS=${WORDCHARS/\/}

もう1つの便利な拡張機能は、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
?

答え4

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
}

関連情報