Eu tenho uma pasta com arquivos duplicados (por md5sum
( md5
em um Mac)) e quero ter umcron trabalho agendado para remover qualquer encontrado.
No entanto, eu estou preso em como fazer isso. O que tenho até agora:
md5 -r * | sort
Que gera algo como isto:
04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg
Como processar com base no MD5 do arquivo para remover duplicatas? Eu realmente não me importo com qual "original" eu mantenho - mas eu só quero manter uma.
Devo abordar isso de uma maneira diferente?
bash
shell-script
hashsum
duplicate
Warren
fonte
fonte
fdupes
comando que fará isso ... Não tenho certeza em qual distro você está, mas está em um pacote Debian com o mesmo nome. Além disso, o MD5 é um hash bastante fraco atualmente; você provavelmente vai querer usarsha256sum
ou melhorsha512sum
(que deve realmente ser mais rápido em hardware de PC normal)Respostas:
Estou trabalhando no Linux, o que significa que é o comando
md5sum
que gera:Agora, usando
awk
exargs
o comando seria:A
awk
peça é inicializadalasthash
com a sequência vazia, que não corresponde a nenhum hash e, em seguida, verifica cada linha se o hash inlasthash
for igual ao hash (primeira coluna) do arquivo atual (segunda coluna). Se for, imprime. No final de cada etapa, ele será definidolasthash
como o hash do arquivo atual (você pode limitar isso para ser definido apenas se os hashes forem diferentes, mas isso deve ser uma coisa menor, especialmente se você não tiver muitos arquivos correspondentes). Os nomes de arquivos que awk cospe são alimentadosrm
comxargs
, o que basicamente chamarm
com o que aawk
parte nos fornece.Você provavelmente precisará filtrar diretórios antes
md5sum *
.Editar:
Usando o método Marcins, você também pode usar este:
Esse substrato da lista de arquivos obtida pelo
ls
primeiro nome do arquivo de cada hash exclusivo obtido pormd5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'
.fonte
md5 -r * | sort -t ' ' -k 4 -r | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm
é a chamada em OS X (por @ Stephen Kitt sugestão 's, eu pôrecho 'will remove '
no final antes de tentar isso comrm
)sort -t ' ' -k 4 -r
parasort
.Você pode identificar arquivos duplicados usando o seguinte comando:
fonte
Encontrei fdupes como resposta a essa pergunta semelhante: /superuser/386199/how-to-remove-duplicated-files-in-a-directory
Eu era capaz
apt-get install fdupes
no Ubuntu. Você definitivamente vai querer ler a página de manual. No meu caso, consegui os resultados desejados da seguinte forma:fdupes -qdN -r /ops/backup/
O que diz "examine recursivamente o arquivo / ops / backup e encontre todos os arquivos duplicados: mantenha a primeira cópia de qualquer arquivo e remova o restante silenciosamente". Isso facilita muito a manutenção de vários despejos de um banco de dados de gravação infreqüente.
fonte
Se você estiver com pressa (ou tiver muitos arquivos) e quiser evitar uma sobrecarga de uma espécie (leva tempo), mas não se importe com a sobrecarga de memória de uma tabela de hash (ou você tem bastante memória RAM com seus lotes) de arquivos),
find . -type f -print0
: Encontre todos os arquivos e produza-os com nomes terminados em nuloxargs -0 md5sum
: calcule hashes em paralelo (ajuste-n
max-args e-P
max-procs conforme desejado, consulteman xargs
)awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }'
: se houver uma entrada na hashtable awk que contenha o md5sum que estamos vendo no momento, imprima o nome do arquivo que estamos vendo no momento, terminado por nulo. Caso contrário, adicione o nome do arquivo à tabela de hash.xargs -0 rm
: pegue as seqüências terminadas em nulo e envie-as para rm.Isso é muito mais rápido que o fdupes.
Se você tiver um nome de arquivo que contenha uma nova linha, o awk provavelmente o truncará na nova linha, pois o md5sum também separa registros por novas linhas.
Isso é baseado em /programming/11532157/remove-duplicate-lines-without-sorting e /programming/9133315/how-can-i-output-null-terminated- cordas-em-awk
fonte
fonte
Recursos:
ls
com uma classificação ou--color=always
fonte