Bash - converte, codifica inteiro em string alfanumérica encurtada

0

Existe alguma maneira no BASH de converter um inteiro em uma string alfanumérica encurtada?

Se eu começar, digamos com var=20171019194210 . Eu gostaria de obter algo parecido com o seguinte.

echo "$var" | encoding
a4f5e6g

E então:

echo "$var" | decoding
20171019194210

Encontrei algo em Python no Stackoverflow ; mas, se possível, eu preferiria usar o BASH com qualquer combinação de ferramentas GNU como awk para fazer isso.

Estou tentando criar um ID exclusivo para arquivos criando um timestamp da seguinte forma.

date +"%Y%m%d%H%M%S"

Depois, incluo esse registro de data e hora no nome do arquivo para identificar o arquivo no sistema sem precisar usar um nome de arquivo inteiro ou para poder identificar o arquivo sem o resto do nome do arquivo.

Eu gostaria agora de encurtar ou codificar esse inteiro para torná-lo mais utilizável em termos de tamanho, mas da mesma forma ter a possibilidade de recalcular o valor do registro de data e hora.

    
por nath 19.10.2017 / 19:32

2 respostas

2

Isso está no bash, então será lento. Ele mapeia 2 números para 1 caractere. Ele usa o alfabeto base64, portanto, só pode acomodar números entre 0 e 63 - não há problema em horas, minutos, segundos, dias e meses, mas vai parar de funcionar em 2064. Estenda o map com mais caracteres para estendê-lo. / p>

declare -a map=(
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    a b c d e f g h i j k l m n o p q r s t u v w x y z 
    0 1 2 3 4 5 6 7 8 9 + /
)

declare -A revmap
for ((i=0; i<${#map[@]}; i++)); do revmap[${map[i]}]=$(printf "%02d" $i); done

encode() { 
    local i result=""
    for ((i=0; $i < ${#1}; i+=2)); do 
        # specifies base 10 numbers to prevent attempted interpretation
        # of invalid octal numbers 08,09
        result+=${map[10#${1:i:2}]:-"?"}
    done
    echo "$result"
}

decode() { 
    local i result=""
    for ((i=0; i<${#1}; i++)); do 
        result+=${revmap[${1:i:1}]:-"??"}
    done
    echo "$result"
}

encode 20171019194210              # => URKTTqK
decode $(encode 20171019194210)    # => 20171019194210

encode 20671019194210              # => U?KTTqK
# .......^^
decode "$(encode 20671019194210)"  # => 20??1019194210
    
por 19.10.2017 / 20:13
1

Quanto mais você espera? Usando representação hexadecimal fará 2 caracteres menos para o número dado. Para um número maior, pode economizar mais.

LONGER=20171019194210                                #compare: 
SHORTER=$(printf "%X\n" $LONGER)                     #12586E6F0F62
RESTORED=$(echo "obase=10; ibase=16; $SHORTER" | bc) #20171019194210
    
por 19.10.2017 / 20:31