Obtendo o nome do arquivo em hexadecimal ou base64

2

Devido a uma pergunta sobre as Recomendações de Software , achei que poderia implementar um programa que analisa a saída de ls -l e exibe os arquivos em um estilo semelhante ao Explorer. Essa abordagem foi sugerida no ServerFault . Ao mesmo tempo, outras pessoas desencorajam a análise de ls .

Então, pergunto-me se existe uma maneira de listar o nome do arquivo em formato hexadecimal ou base64, o que poderia ignorar quaisquer caracteres especiais como \n e similares.

    
por Thomas Weller 04.06.2016 / 02:05

2 respostas

1

Eu estou supondo que você deseja exibir nomes de arquivos ao lado de seu valor hexadecimal. Nesse caso, aqui está uma linha simples de código para demonstrar que isso é possível:

$ touch abc 'd e f' 
$ find . -maxdepth 1 -type f -exec sh -c 'printf "%-10s %s\n" "" "$(printf "" | xxd -pu )"' None {} \;
./abc      2e2f616263
./d e f    2e2f6420652066

A ideia é que para cada arquivo que encontramos, corremos printf com uma string de formatação e dois argumentos. O primeiro argumento é o nome do arquivo e o segundo é o nome do arquivo convertido em hexadecimal com o utilitário xxd .

Mais personalização da saída é deixada como um exercício para o leitor.

    
por John1024 04.06.2016 / 04:39
0

Bem, me chame de noob, mas eu tentei a sugestão do John1024 e isso me deu um erro, então eu tentei descobrir por conta própria. Eu fiz um arquivo chamado readline.sh que continha o seguinte:

#!/bin/bash

file=      #  contains the argument passed
> line.txt   # create/empty line.txt
IFS=$'\n'    # set Internal Field Separator to '\n'
for line in 'cat $file'       # assign each line in $file to $line
do
    echo $line >> line.txt    # print $line to line.txt

    # this one's tricky because you need to pipe just the line
    # (without a '\n') into xxd and then print it to line.txt
    echo 'printf "%s" "$line" | xxd -p' >> line.txt
done
cat line.txt     # we want to see the contents of line.txt now

Agora, para executá-lo, chamei ls | ./readline.sh e o resultado é o seguinte:

bar
626172
baz
62617a
foo
666f6f
line.txt
6c696e652e747874
readline.sh
726561646c696e652e7368

Agora, quero ressaltar que este script não tem nenhuma maneira de verificar se o $ 1 existe, e provavelmente há outros problemas com ele, mas, supondo que eu entendi a sua pergunta corretamente, parece que a essência da solução é canalizar a saída de ls linha por linha em xxd -p . Todo o fluff extra foi a) para me certificar de que funcionou antes de postar e b) para mostrar o princípio em ação.

    
por TallChuck 04.06.2016 / 08:59