Como renomear múltiplos arquivos para a soma MD5 de seu conteúdo?

4

Gostaria de renomear alguns arquivos para a soma MD5 de seu conteúdo; por exemplo, se o arquivo foo estiver vazio, ele deverá ser renomeado para d41d8cd98f00b204e9800998ecf8427e .

Precisa ser script ou posso usar algo como a ferramenta rename ?

    
por Igor V. 17.09.2015 / 22:28

3 respostas

7

A resposta de Glenn é boa; aqui está um refinamento para vários arquivos:

md5sum file1 file2 file3 | # or *.txt, or whatever
    while read -r sum filename; do
        mv -v "$filename" "$sum"
    done

Se você estiver gerando arquivos com find ou similar, poderá substituir a invocação md5sum por algo como find . <options> -print0 | xargs -0 md5sum (com a saída também canalizada para o loop do shell).

Isso está tomando a saída de md5sum , que consiste em várias linhas com uma soma e, em seguida, no arquivo ao qual corresponde e em um loop de shell que lê cada linha e emite um comando mv que renomeia o arquivo do nome original para a soma. Todos os arquivos com somas idênticas serão sobrescritos; no entanto, salvo circunstâncias incomuns (como se você estivesse brincando com colisões de hash do md5), isso significa que eles tinham o mesmo conteúdo, para que você não perdesse nenhum dado de qualquer maneira. Se você precisar introduzir outras operações em cada arquivo, poderá colocá-las no loop, consultando as variáveis $filename e $sum , que contêm o nome do arquivo original e a soma MD5, respectivamente.

    
por 17.09.2015 / 22:37
4

com zsh :

autoload zmv # best in ~/.zshrc
zmv '**/*(#qD.)' '$(md5sum<$f)'

Renomeia todos os arquivos regulares, de forma recursiva.

(note que ele irá se recusar a renomear qualquer arquivo se dois arquivos no mesmo diretório tiverem a mesma soma de verificação, adicione -f para sobrescrever isso).

**/*(#qD.) is zsh de globs recursivos com qualificadores glob (em sua forma explícita como (#q<qualifiers>) , D para incluir arquivos ocultos, . para selecionar apenas arquivos regulares .

    
por 17.09.2015 / 22:39
3

bash:

md5sum my.file.here | { read sum filename; mv $filename $sum; }
    
por 17.09.2015 / 22:34