Renomear arquivos com base na soma de verificação

6

Eu tenho uma lista md5sum e um monte de arquivo que eu queria verificar e depois renomeá-los de acordo com a lista md5sum.

Exemplo da lista:

d4cd401ade018617629b39efed7b7be4  foo.bar
8fdb07ca55c164e0d5a69eff49fe800e  bar.foo
8b167d01009f066aaf2d6c1ba336d842  foobar

Agora eu queria verificar todos os arquivos no diretório atual, se a soma de verificação fosse correspondida com a lista acima e renomeá-la como a coluna correta.

Como posso fazer isso?

    
por SandPox 06.12.2016 / 13:56

4 respostas

2

Talvez isso possa ajudar. Eu não testei totalmente, é apenas teoricamente funcionando. Substitua quando necessário:

#! /bin/bash
for II in *
do
    if [ -f "$II" ]; then
        TMPV=$(md5sum "$II")
        MD="${TMPV%\ \ *}"
        TMPV=$(grep "$MD" hashes.txt)
        if [ ! -z "$TMPV" ]; then
            FN="${TMPV#*\ \ }"
            echo "Found: $II"
            echo "MD5 is: $MD"
            echo "Which matches $FN in hashes database"
            echo "Will Rename $II TO $FN"
            echo ""
            # CAREFUL, RENAME CMD: mv "$II" "$FN"
        fi;
    fi;
done;

Como eu disse, não testei, mas pareceu funcionar na minha caixa. Espero que ajude.

    
por 06.12.2016 / 14:46
3
Primeiro de tudo, eu não vou afirmar que esta é a solução mais profunda, mas aqui está uma maneira de fazer isso.

Digamos que você tenha o arquivo com a soma de verificação e os nomes de arquivos chamados filelist.txt , então você poderia usar algo como:

while read -r checksum fname; do for f in file*; do if [[ $checksum == $(md5sum "$f" | cut -d' ' -f1) ]]; then mv "$f" "$fname"; fi ; done ; done < filelist.txt
    
por 06.12.2016 / 14:45
0

Minha ideia:

  1. Primeiramente, você precisa classificar suas somas de verificação conhecidas: sort checksums.txt > sorted_checksums.txt
  2. Gerar arquivo para todos os arquivos existentes e também classificá-los: md5sum * | sort > real_checksums.txt
  3. Junte esses dois arquivos e exclua registros com os mesmos nomes novos e antigos: join -o "2.2 1.2" sorted_checksums.txt real_checksums.txt | awk '$1 != $2' > rename_pairs.txt
  4. Renomeie todos os arquivos: cat rename_pairs.txt | xargs -L 1 echo mv (remova echo de xargs para realmente renomear arquivos)

AVISO: isso funcionará somente se não houver espaços em nomes de arquivos. Você pode usar awk 'NF != 2' sorted_checksums.txt real_checksums.txt para verificar isso e se houver alguma linha impressa, você precisará usar outra coisa (pode ser simples perl ou python programa) para as etapas 3 e 4.

    
por 06.12.2016 / 17:36
0

Leia as somas de verificação em um array associativo, percorra os arquivos e renomeie-os conforme necessário. Coloque os arquivos renomeados em uma árvore de diretórios separada, caso haja sobreposição entre os novos nomes e os nomes antigos.

#!/bin/bash
mkdir renamed
typeset -A names
while read -r sum name; do
  names[$sum]=$name
done <list.md5sum
for file in *; do
  if [[ -f $file ]]; then
    sum=$(md5sum <"$file"); sum=${sum%% *}
    if [[ -n ${names[$sum]} ]]; then
      mv -- "$file" "renamed/${names[$sum]}"
    fi
  fi
done
    
por 07.12.2016 / 02:31