사용자 함수는 주어진 이름을 가진 가장 가까운 디렉토리로 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각 루프에 대해 루트 폴더에 해당하는 폴더에 도달할 때까지 트리에서 폴더를 하나 더 검색합니다 /.

용법:cdd targetname

예:

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

여러 디렉터리가 발견되면 select메뉴가 표시됩니다.

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

관련 정보