「cd dir / filename」でdir /に移動するにはどうすればよいですか?


10

ファイル引数cdとともに使用できると非常に便利です

cd myDirectory/anyname.anyExtension に相当する cd myDirectory/

この動作を実現するための最良のエイリアスまたは関数は何ですか?

編集:申し訳ありませんが私はそもそもそれについて言及していません:私は使用しますzsh

回答:


5

zsh、私はよくやります:

cd /path/to/somefile(:h)

hためhead)。

somefileがシンボリックリンクの場合、次のこともできます。

cd somefile(:A:h)

シンボリックリンクのターゲットが見つかる可能性があるディレクトリに移動します。


zshクリスの今の同等bashのみのソリューションは次のようになります。

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

ではzsh、「単語」がCtrl-W削除するものを再定義することもできます。

ではzsh、単語ベースのモーション/転置/削除ウィジェットのコンテキストでの「単語」は、一連のalnumと、$WORDCHARSデフォルトでを含む変数内の文字です/

あなたは削除することもできます/から、$WORDCHARSそのようCtrl-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
?

面白い。(私もzshを使用しています)。
セバスチャン2013年

zshと単語スタイルに関する非常に興味深い編集。zshコマンドもありがとうございます。それは完全に仕事をします。
セバスチャン2013年

15

ディレクトリを入力し、を使用している場合でも、元の機能を保持する必要があると思います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
}

4
関数名をcdに変更する場合builtinは、cd呼び出しの前に必ず追加してください
Ulrich Dangel

@クリス:あなたは正しいと思いました;)これはすぐに使える機能に感謝します
セバスチャン

cdオプションを保持するバージョンは、では機能しませんzsh。シンプルな1はで罰金を働かないzsh、しかしcdとしてもはや同等ですcd ~:/
セバスチャン・

@Sebastien試してみてください。これで問題が解決すると思います。
Chris Down

@Chris、確かにチェックを追加する[ -z "$1" ]だけで十分でした。Stephaneの回答は、の最善の解決策であると思われるため、視認性を高めるために受け入れましたzsh
セバスチャン2013年

7

あなたdirnameはパスからファイル名を取り除くために使うことができます、例えば

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

を参照してくださいman dirname


3
ディレクトリを入力すると、そのディレクトリより上のディレクトリに変更されることに注意してください。これは望ましくない場合があります(これが望ましいかどうかの質問からは不明確です)。
Chris Down

1
@ChrisDown True、しかし私はそれを読者への演習として残し、あなたの答えはそれをどう扱うかを示しています。
エイドリアンFrühwirth2013年

1
@AdrianFrühwirthエクササイズ!ハァッ!

3

これをに追加して.profileロードすると(source ~/.profileまたはログアウトして再度ログインすると)、mycd [file or directory]正しいディレクトリに移動します。

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

名前を付けるとcd、奇妙なことが起こります。


1
これは、ディレクトリ名に空白が含まれていて、コマンドグループを終了するために閉じるセミコロンが必要な場合に機能しなくなります。あなたのためにそれを編集しました、あなたが気にしないことを願っています。
Chris Down

@ChrisDown、それは他のシェルにも当てはまりますが、で閉じるセミコロンは必要ありませんzsh
ステファンChazelas

また、のcdようにargsを渡すと、これは壊れ-Pます。
クリスダウン

0
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
}

というディレクトリが与えられた$(sudo reboot)場合、この関数はシステムを再起動します。また、ユーザーはではzshなくを使用していbashます。
クサラナンダ

コマンド$(sudo reboot)を実行すると、この関数はシステムを再起動します。また、+ 1最初は「zsh」に気づきませんでした。
ecwpz91 2018

いいえ、cd '$(sudo reboot)'ディレクトリを変更しますが、関数は名前を評価しようとします。
クサラナンダ

ああ、私は見て変更を加えました。うまくいくかどうか教えてください。良いキャッチ。
ecwpz91 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.