Saída em lote md5 com o nome do arquivo correspondente ao arquivo de texto

1

Estou tentando enviar para um arquivo de texto uma soma de verificação md5 de cada arquivo em uma pasta nesse formato específico:

checksumhash1 *NameOfFile1.ext
checksumhash2 *NameOfFile2.ext
checksumhash3 *NameOfFile3.ext
etc...

Veja um exemplo da saída que precisaria ser:

00c0eb18b7bfd2bf985451ae3ad5d68e *My Text File.txt
4935705ea05dabef98921b18aeeaadd3 *Another file.wmv

Tentei o comando abaixo, e isso é o mais perto que posso chegar:

md5 -r * | tee checksum.txt

De lá, estou perdido e não consigo descobrir como fazer com que a saída do md5 corresponda à formatação de que preciso. Eu só preciso desse "*" na frente do nome do arquivo.

Alguma Gurus por aí? = P

    
por Weekender 14.04.2014 / 19:48

2 respostas

2

Você pode encadear a saída que já está obtendo em sed (ou outro programa de edição de fluxo) para adicionar o caractere extra necessário:

$ md5 -r * | sed 's/ / */'
69c3da625b4570f94889c9562453d394 *file1.ext
8046313ae98a6c9f1cb2c9957cdfbe7c *file2.ext
16250bebbd00e759138d09dd0cab0cb8 *file3.ext
d41d8cd98f00b204e9800998ecf8427e *file with space.ext

Neste caso, o comando sed apenas substitui o primeiro [espaço] por [espaço] [asterisco]. Você pode modificar a expressão conforme necessário se precisar que ela se comporte de maneira diferente.

    
por 14.04.2014 / 20:28
0

Primeiro, você não precisa de tee , você pode apenas redirecionar para um arquivo usando > . Agora, adicionando o * requer alguns truques. Aqui está um casal:

  1. Perl

    md5 * | perl -pe 's/ / */' > checksum.txt
    

    Isso é o mesmo que a resposta de tenorkev, apenas feita em perl. O -p significa processar a entrada linha por linha, aplicar o script fornecido por -e e imprimir. O s/// é o operador de substituição e substitui o primeiro espaço por um espaço seguido por * .

  2. casca pura

    md5 * | while read a b; do echo "$a *$b"; done > checksum.txt
    

    Aqui, o while read a b lerá cada linha e a dividirá em espaços em branco nas variáveis $a e $b . Isso significa que o has será $a e o restante da linha será variável $b . Portanto, a impressão ( echo ) $a *$b fornecerá a saída desejada.

por 14.04.2014 / 20:50