Como decodifico uma lista de nomes de arquivos codificados em base64?

4

Eu tenho uma lista de nomes de arquivos codificados em base64 no padrão de {base64-encoded part here}_2015-11-12.pdf . Eu estou tentando decodificar essa lista de arquivos e retorná-lo na linha de comando como outra lista, separada por novas linhas. Aqui está o que estou tentando agora:

find . -name "*_*" -printf "%f
find . -name "*_*" -printf "%f%pre%" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d
" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d

Eu acho que o que estou fazendo aqui é. . .

  1. localizar os arquivos, imprimindo apenas o nome do arquivo (isto é, retirando o prefixo "./") separado por um caractere nulo
  2. usando sed para preservar apenas a parte codificada em base64 (ou seja, removendo a parte _2015-11-12.pdf do nome do arquivo)
  3. usando xargs para passar cada nome de arquivo para eco
  4. decodificando o valor retornado pelo eco.

O resultado disso é aparentemente uma grande cadeia de todos os nomes de arquivos decodificados em base64, cada nome separado por um caractere nulo, com a sequência inteira seguida por uma nova linha. O resultado desejado seria cada nome de arquivo individual decodificado em uma linha por si só.

Eu tentei todos os tipos de truques para tentar consertar isso, mas não encontrei nada que funcionasse. Eu tentei ... | base64 -d | echo , ... | base64 -d && echo , etc., tentando inserir uma nova linha em vários pontos ao longo do caminho. Parece que, quando os valores acabam em | base64 -d , todos eles são processados de uma vez, como uma única string. Estou tentando encontrar uma maneira de enviar cada valor para base64 -d , um por vez, NÃO como uma lista monolítica de nomes de arquivos.

    
por hourback 02.03.2016 / 22:09

2 respostas

5

Basta adicionar a codificação base64 da nova linha ( Cg== ) após cada nome de arquivo e canalizar tudo para base64 -d :

find . -name "*_*" -printf "%f\n" |
  sed -n 's/_....-..-..\.pdf$/Cg==/p' |
  base64 -d

Com sua abordagem, isso teria que ser algo como:

find . -name "*_*" -printf "%f
find . -name "*_*" -printf "%f\n" |
  sed -n 's/_....-..-..\.pdf$/Cg==/p' |
  base64 -d
" | sed -zn 's/_....-..-..\.pdf$//p' | xargs -r0 sh -c ' for i do echo "$i" | base64 -d done' sh

como você precisa de um shell para criar esses pipelines. Mas isso significaria executar vários comandos por arquivo, o que seria bastante ineficiente.

    
por 02.03.2016 / 22:24
3

Um truque é codificar \n em base64 ... assim, torna-se Cg== , que você pode anexar ao comando printf. Um '\' não pode estar em um nome de arquivo. Então, no final, você pode sedá-lo de volta

find . -name "*_*" -printf "%f%code%Cg==" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d | sed 's/\n/\n/g'

    
por 02.03.2016 / 22:25