Removendo arquivos duplicados, mantendo apenas o arquivo mais novo

0

Estou tentando limpar uma pasta de despejo de fotos, na qual vários arquivos são duplicados, mas com nomes de arquivos diferentes ou perdidos em subpastas.

Eu olhei para ferramentas como rmlint, duff e fdupes, mas não consigo encontrar uma maneira de tê-las mantendo apenas o arquivo com o timestamp mais recente. Eu suspeito que tenho que pós-processar os resultados, mas nem sei por onde começar a fazer isso.

Alguém pode me orientar sobre como obter a lista de arquivos duplicados e excluir tudo, exceto o arquivo mais recente?

    
por pinkie_d_pie_0228 13.11.2012 / 05:27

2 respostas

1

Note que eu uso o shell zsh.

Tente algo como o seguinte (não testado; com base no link ):

# checksum everything in ${DIR}
cksums=$(mktemp)
find ${DIR} -xdev -type f -print0 | xargs -0 md5sum > $cksums

# loop through each md5 hash found
for hash in $(sort $cksums | uniq -w 32 -d | cut -c 1-32); do
  # list of files with this hash
  files=$(grep $hash $cksums | cut -c 35-)
  f=(${(f)files})
  unset files
  # $f now contains array of files with the same checksum
  # compare the first file to the rest, deleting any that are older
  newest=$f[1]
  for file in $f[2,-1]; do
    # make sure the files are still the same
    cmp $newest $file || continue
    # remove the older file
    if [[ $file -nt $newest ]]; then
      rm $newest
      newest=$file
    else
      rm $file
    fi
  done
done

Não foi testado, mas deve ajudá-lo a maior parte do caminho. Deixe-me saber se alguma coisa precisar de mais explicações.

    
por 13.11.2012 / 07:44
0

Eu iria echo da soma de verificação gerada usando o comando sum e o nome de arquivo de cada um dos vários arquivos, depois classificaria por soma de verificação. Você pode verificar se aqueles com a mesma soma de verificação estão de fato duplicados usando cmp .

    
por 13.11.2012 / 07:01