用户函数 cd 到具有给定名称的最近目录

用户函数 cd 到具有给定名称的最近目录

有人可以将用户定义的函数放入我的 .basrc 中来执行此操作吗?下面的例子应该可以解释我的想法。

给定以下文件系统:

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

假设该函数称为 goto。

goto(TestA):应该将我们带到 level1 testA 目录
goto(TestZ):应该让我们保持在原地并打印类似“未找到”的内容
goto(TestB):应该将我们带到 level2 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到达相当于根文件夹的位置/

用法:cdd targetname

例子:

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

如果找到多个目录,它将显示一个select菜单。

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

相关内容