5

cdKornShell(ksh)には、同様のディレクトリ構造をトラバースするための非常に便利なオプションがありました。たとえば、次のディレクトリが与えられます。

  • /home/sweet/dev/projects/trunk/projecta/app/models
  • /home/andy/dev/projects/trunk/projecta/app/models

次に、/home/sweet...ディレクトリにいる場合は、次のように入力して、andyの構造内の同等のディレクトリに変更できます。

cd sweet andy

したがって、kshが2つの引数を検出した場合、現在のディレクトリパスで最初の値をスキャンし、それを2番目の値に置き換えて、そこでcdします。Bashに組み込まれている同様の機能を知っている人はいますか?または、そうでない場合は、Bashを同じように機能させるためのハックですか?

4

3 に答える 3

5

これまでに提供された他のソリューションには、次の1つ以上の問題があります。

  • 古語形式のテスト-MichałGórnyが指摘したように
  • 空白を含むディレクトリ名からの不完全な保護
  • 同じ名前が複数回使用されている、またはサブストリングが一致するディレクトリ構造を処理できない:/canis/lupus/lupus/または/nicknames/Robert/Rob/

このバージョンは、上記のすべての問題を処理します。

cd () 
{ 
    local pwd="${PWD}/"; # we need a slash at the end so we can check for it, too
    if [[ "$1" == "-e" ]]
    then
        shift
        # start from the end
        [[ "$2" ]] && builtin cd "${pwd%/$1/*}/${2:-$1}/${pwd##*/$1/}" || builtin cd "$@"
    else
        # start from the beginning
        [[ "$2" ]] &&  builtin cd "${pwd/\/$1\///$2/}" || builtin cd "$@"
    fi
}

cdXこのようなディレクトリから、私が呼び出す他のバージョンのいずれかを発行します。

    / canis / lupus / lupus / specimen $ cdXlupusfamiliaris
    bash:cd:/ canis / familiaris / lupus / specimen:そのようなファイルやディレクトリはありません

「ループス」の2番目のインスタンスが意図したものである場合は失敗します。これに対応するために、「-e」オプションを使用して、ディレクトリ構造の最後から開始できます。

    / canis / lupus / lupus / specimen $ cd -e lupusfamiliaris
    / canis / lupus / familiaris/標本$

または、これからそれらの1つを発行します。

    / nicknames / Robert / Rob $ cdX Rob Bob
    bash:cd:/ nicknames / Bobert / Rob:そのようなファイルやディレクトリはありません

文字列の一部を意図せずに置き換えてしまいます。私の関数は、マッチにスラッシュを含めることでこれを処理します。

    / nicknames / Robert / Rob $ cd Rob Bob
    / nicknames / Robert / Bob $

次のように、ディレクトリを明確に指定することもできます。

    / fish / fish / fins $ cd fish/finsロボット/fins
    / fish / robot / fins $

ちなみに、私は... ... ...の代わりに、制御演算子&&と関数を使用しました。||ifthenelsefi

于 2009-09-07T05:44:49.450 に答える
3
cd "${PWD/sweet/andy}"
于 2009-09-06T19:43:57.270 に答える
2

いいえ、でも...

MichałGórnyの置換式はうまく機能します。組み込みのcdコマンドを再定義するには、次のようにします。

cd () {
  if [ "x$2" != x ]; then
    builtin cd ${PWD/$1/$2}
  else
    builtin cd "$@"
  fi
}
于 2009-09-06T19:40:25.407 に答える