Mover / Renomear muitos arquivos com tamanho de arquivo específico

4

Recuperei muitas fotos (mais de 1.000) de um cartão SD ruim. Todos, exceto 75, que parece estar "quebrado". Eu corri um programa para obter todas as imagens lendo em um nível inferior e descobri que eu tenho todas as fotos, incluindo os que não são legíveis no cartão SD, o problema é que eles foram recuperados com nomes diferentes e muito são duplicados .

Eu quero encontrar o arquivo (se houver mais de um, apenas pegar o primeiro) na pasta 'bom' com exatamente o mesmo tamanho que cada arquivo da pasta 'bad' e renomeá-lo com seu nome. / p>

Eu executei este comando ls -lR | egrep -v '^d' | awk '==5040057{print}'

e eu tenho esse resultado

-rw-r--r-- 1 user user  5040057 Apr  6 04:47 _MG_2443.JPG
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f11146176.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f12072256.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f14834560.jpg

Edit: Ele não aparece no resultado do comando, mas a estrutura da pasta é a seguinte:

Recovery:
 |- Bad ( containing _MG_XXXX.JPG files )
 |- Good ( Containing fXXXXXXXX.jpg files )

Onde o primeiro _IMG_2443.JPG é a imagem incorreta e qualquer um dos itens a seguir é bom (esses são os candidatos a serem renomeados ou movidos). Assim, para o exemplo anterior, eu gostaria que, por exemplo, o arquivo 'f11146176.jpg' fosse renomeado na pasta Boa como '_MG_2443.JPG' para que eu possa verificá-lo mais tarde e substituí-lo na pasta ruim.

Existe uma maneira de executar um comando para fazer isso automaticamente para todas as fotos? Obrigado

    
por SERPRO 06.05.2014 / 12:52

1 resposta

3

O tamanho do arquivo não é uma boa maneira de determinar duplicatas. Você pode ter dois arquivos com o mesmo tamanho, mas com conteúdo diferente. Isso significa que é bem provável que essa abordagem falhe. Dito isto, o seguinte fará o que você pediu.

Importante: isso pressupõe que seus nomes de arquivos não tenham espaços nem novas linhas.

find bad -iname "*.jpg" -printf "%s %f\n" | while read -r bs bf; do 
  find good/ -iname "*.jpg" -printf "%s %f\n" | while read -r gs gf; do 
    [ $bs -eq $gs ] && echo "mv good/$gf good/$bf"; 
  done 
done

Explicação

  • find bad -iname "*.jpg" -printf "%s %f\n" : localize todos os arquivos cujo nome termine em .jpg ou .JPG no diretório bad e imprima seu tamanho e nome de arquivo.
  • while read -r bs bf; do : leia cada linha da saída acima, salvando o tamanho do arquivo como $bs e seu nome como $bf .
  • O segundo find ... | while ...; done faz exatamente o mesmo para o diretório good , salvando o tamanho do arquivo como $gs e seu nome como $gf .
  • [[ $bs -eq $gs ]] && echo "mv good/$gf good/$bf"; : Se o tamanho do arquivo incorreto for o mesmo que o tamanho do arquivo bom, renomeie o arquivo bom usando o nome do arquivo inválido. Se isso acontecer, remova o eco e altere a linha para simplesmente mv good/"$gf" good/"$bf" . Observe que isso manterá o último nome de arquivo 'incorreto' como o nome final do arquivo 'bom'.

Eu quero enfatizar que isso não é seguro, arquivos diferentes podem ter exatamente o mesmo tamanho e conteúdo completamente diferente. Em vez de usar essa abordagem ingênua, talvez seja melhor usar um programa projetado especificamente para comparar imagens. Eu nunca usei nenhum desses softwares, mas uma pesquisa de 3 minutos apareceu DupeGuru . Eu sugiro que você tente primeiro:

  

DupeGuru : dupeGuru Picture Edition (PE, abreviado) é uma ferramenta para encontrar imagens duplicadas no seu computador. dupeGuru PE é um irmão mais velho do dupeGuru.

     

Este software funciona como o dupeGuru, mas é especializado na correspondência de imagens duplicadas. O dupeGuru PE é executado no Windows, Mac OS X e Linux.

    
por terdon 06.05.2014 / 14:13