ユーザー関数は、指定された名前の最も近いディレクトリにCDを移動します。

ユーザー関数は、指定された名前の最も近いディレクトリにCDを移動します。

誰かがこれを行うために私の.basrcにカスタム関数を置くことができますか?次の例は私の考えを説明しています。

次のファイルシステムがあると仮定すると、

    Level1   Level2  Level3
  / TestA
~ - TestB   
  \ TestC  - TestB
           - TestD - CurrentLocation

関数名がgotoだとしましょう。

goto(TestA): レベル 1 testA ディレクトリに移動する必要があります。
goto(TestZ): 現在位置を維持し、「notfound」などの内容を印刷する必要があります。
goto(TestB): 最も近いレベル 2 testB に移動する必要があります。

検索は複数のファイルと一致するため、以下ではなく親ディレクトリにのみ移動できます。

ありがとう

答え1

この試み、

cdd(){
depth=$(pwd | tr -dc '/' | wc -c)
for ((d=0;d<=depth;d++)); do
    [ $d -eq 0 ] && search_dir="." || search_dir=$(printf '../%.0s' $(seq 1 $d))
    res=( )
    while IFS= read -r -d '' item; do
        res+=( "$item" )
    done < <(find $search_dir -mindepth 1 -maxdepth 1 -type d -name "$1" -print0)
    if [ ${#res[@]} -eq 0 ]; then
        continue
    elif [ ${#res[@]} -eq 1 ]; then
        t="$res"
    elif [ ${#res[@]} -gt 1 ]; then
        select t in "${res[@]}"; do
            break
        done
    fi
    echo "$t"
    cd "$t" && return || { echo "Unknown Error"; return; }
done
echo "Not found"
}

$depth各ループについて、ルートフォルダに対応するフォルダに到達するまでツリー内のフォルダをもう1つ検索します/

使用法:cdd targetname

例:

$ cdd home
../../../home

複数のディレクトリが見つかると、selectメニューが表示されます。

$ cdd "D*"
1) ../Documents
2) ../Downloads
3) ../Desktop
#? 2
../Downloads

関連情報