경로에서 오류를 찾거나 수정하는 방법

경로에서 오류를 찾거나 수정하는 방법

긴 경로를 잘못 입력하거나 경로가 존재하지 않는다는 로그 파일 항목을 얻는 경우가 많습니다. 일치하는 경로를 찾을 때까지 경로 계층 구조를 탐색하는 명령이나 셸 기능이 있습니까?

명령줄 교환은 다음과 같이 진행될 수 있습니다.

$ ls /var/lib/my/supper/complicated/path
File or directory not found
$ fixpath /var/lib/my/supper/complicated/path
Found /var/lib/my

보너스 기능으로 유사성 감지가 유용할 것입니다.

$ fixpath /var/lib/my/supper/complicated/path
Found /var/lib/my
Did you mean /var/lib/my/super/complicated/path

답변1

 $ fixpath /home/user/docus/collection/unix/djakl/jfkdsl/dfjksld/fsdkl
Found /home/user/docus/collection/unix
 $ type fixpath
fixpath is a function
fixpath ()
{
    CURDIR="$PWD";
    DIR="$1";
    E=1;
    while [ $E -eq 1 ]; do
        cd "$DIR" 2> /dev/null && {
            E=0;
            echo Found "$DIR"
        } || {
            DIR="${DIR%/*}";
            DIR="${DIR:-/}"
        };
    done;
    cd "$CURDIR"
}

유사성 자동 수정은 대부분의 최신 쉘에서 자체적으로 수행할 수 있습니다. 적어도 bash와 zsh는 그렇습니다.

답변2

다음 셸 함수는 경로 이름을 가져와서 실제로 존재하는 가장 긴 비트를 결정합니다. 경로가 완전히 비어 있거나 실제로 존재하는 파일(또는 디렉터리 등)에 해당할 때까지 경로에서 마지막 경로 요소를 제거하여 이를 수행합니다.

fixpath () (
    pathname="$1"

    while [ -n "$pathname" ] && [ ! -e "$pathname" ]; do
        pathname=${pathname%/*}
        case "$pathname" in
            */*) continue ;;
            *) [ -e "$pathname" ] || pathname=''
               break
        esac
    done

    printf 'Longest existing path in "%s" is "%s"\n' "$1" "$pathname"
)

이 문은 a가 포함되지 않은 case경우 루프를 종료하는 데 필요합니다 (즉, 변수 대체에 의해 수정되지 않음을 의미). 이는 일부 상황에서 무한 루프를 방지합니다.$pathname/

테스트하기:

$ fixpath /home/kk/blaha/123
Longest existing path in "/home/kk/blaha/123" is "/home/kk"

$ fixpath "$HOME/.profile"
Longest existing path in "/home/kk/.profile" is "/home/kk/.profile"

$ fixpath "n"
Longest existing path in "n" is ""

관련 정보