これまでに提供された他のソリューションには、次の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