有人可以将用户定义的函数放入我的 .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