Como encontrar / corrigir erro em um caminho

1

Muitas vezes, um caminho longo é digitado incorretamente ou você recebe uma entrada de arquivo de log que um caminho não existe. Existe uma função de comando ou shell que navega na hierarquia de caminho até encontrar um caminho correspondente?

A troca de linha de comando pode ser assim:

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

Como recurso bônus, uma detecção de similaridade seria ótima:

$ fixpath /var/lib/my/supper/complicated/path
Found /var/lib/my
Did you mean /var/lib/my/super/complicated/path
    
por chiborg 26.06.2012 / 15:38

2 respostas

4

 $ 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"
}
Autocorreção de semelhança A maioria das shells modernas pode fazer sozinha. Pelo menos, bash e zsh do.

    
por 26.06.2012 / 16:01
0

A seguinte função de shell usa um nome de caminho e determina o maior número que realmente existe. Ele faz isso removendo o último elemento de caminho do caminho até que o caminho esteja completamente vazio ou corresponda a um arquivo (ou diretório, ou qualquer coisa) que realmente exista.

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 instrução case é necessária para finalizar o loop, no caso em que $pathname não contenha / (o que significa que não seria modificado pela substituição da variável). Isso evita um loop infinito em algumas circunstâncias.

Teste:

$ 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 ""
    
por 17.02.2018 / 13:17