누군가가 이 작업을 수행하기 위해 내 .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
각 루프에 대해 루트 폴더에 해당하는 폴더에 도달할 때까지 트리에서 폴더를 하나 더 검색합니다 /
.
용법:cdd targetname
예:
$ cdd home
../../../home
여러 디렉터리가 발견되면 select
메뉴가 표시됩니다.
$ cdd "D*"
1) ../Documents
2) ../Downloads
3) ../Desktop
#? 2
../Downloads