J'ai un dossier avec des fichiers en double (par md5sum
( md5
sur un Mac)) et je veux avoir uncron tâche planifiée pour supprimer tout élément trouvé.
Cependant, je suis coincé sur la façon de procéder. Ce que j'ai jusqu'à présent:
md5 -r * | sort
Qui génère quelque chose comme ceci:
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
Comment puis-je traiter en fonction du MD5 du fichier pour supprimer les doublons? Peu m'importe quel "original" je garde - mais je veux seulement en garder un.
Dois-je aborder cela d'une manière différente?
bash
shell-script
hashsum
duplicate
garenne
la source
la source
fdupes
commande qui fera ça ... Je ne sais pas sur quelle distribution vous vous trouvez, mais c'est dans un paquet Debian du même nom. De plus, MD5 est un hachage assez faible de nos jours; vous voulez probablement utilisersha256sum
ou mieuxsha512sum
(qui devrait en fait être plus rapide sur le matériel PC normal)Réponses:
Je travaille sur Linux, ce qui signifie que la commande est la
md5sum
sortie:Maintenant, utiliser
awk
etxargs
la commande serait:La
awk
partie s'initialiselasthash
avec la chaîne vide, qui ne correspondra à aucun hachage, puis vérifie pour chaque ligne si le hachage danslasthash
est le même que le hachage (première colonne) du fichier en cours (deuxième colonne). Si c'est le cas, il l'imprime. À la fin de chaque étape, il sera définilasthash
sur le hachage du fichier actuel (vous pouvez limiter cela à seulement si les hachages sont différents, mais cela devrait être une chose mineure surtout si vous n'avez pas beaucoup de fichiers correspondants). Les noms de fichiers awk crachent sont alimentésrm
avecxargs
, ce qui appelle essentiellementrm
avec ce que laawk
partie nous donne.Vous devez probablement filtrer les répertoires avant
md5sum *
.Éditer:
En utilisant la méthode Marcins, vous pouvez également utiliser celle-ci:
Cela soustrait la liste de fichiers choisie par
ls
le premier nom de fichier de chaque hachage unique choisi parmd5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'
.la source
md5 -r * | sort -t ' ' -k 4 -r | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm
c'est l'appel sur OS X (selon la suggestion de @ Stephen Kitt , j'ai mis unecho 'will remove '
à la fin avant de l'essayer avecrm
)sort -t ' ' -k 4 -r
poursort
.Vous pouvez identifier les fichiers en double à l'aide de la commande suivante:
la source
J'ai rencontré fdupes en réponse à cette question similaire: /superuser/386199/how-to-remove-duplicated-files-in-a-directory
J'ai pu le faire
apt-get install fdupes
sur Ubuntu. Vous voudrez certainement lire la page de manuel. Dans mon cas, j'ai pu obtenir les résultats souhaités comme suit:fdupes -qdN -r /ops/backup/
Qui dit "regardez récursivement dans / ops / backup et trouvez tous les fichiers en double: conservez la première copie d'un fichier donné et supprimez tranquillement le reste". Cela permet de conserver très facilement plusieurs vidages d'une base de données à écriture peu fréquente.
la source
Si vous êtes pressé (ou si vous avez beaucoup de fichiers) et que vous voulez éviter les frais généraux d'une sorte (cela prend du temps), mais ne vous occupez pas de la surcharge de mémoire d'une table de hachage (ou vous avez beaucoup de RAM avec vos lots de fichiers),
find . -type f -print0
: Rechercher tous les fichiers et les afficher avec des noms se terminant par nullxargs -0 md5sum
: calculer les hachages en parallèle (ajustez-n
max-args et-P
max-procs comme vous le souhaitez, voirman xargs
)awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }'
: s'il y a une entrée dans la table de hachage awk contenant la somme md5 que nous regardons actuellement, alors imprimez le nom de fichier que nous regardons actuellement, terminé par null. Sinon, ajoutez le nom de fichier à la table de hachage.xargs -0 rm
: prenez les chaînes terminées nulles et envoyez-les à rm.C'est bien plus rapide que fdupes.
Si vous avez un nom de fichier qui contient une nouvelle ligne, awk le tronquera probablement sur la nouvelle ligne car md5sum sépare également les enregistrements par des nouvelles lignes.
Ceci est basé sur /programming/11532157/remove-duplicate-lines-without-sorting et /programming/9133315/how-can-i-output-null-terminated- cordes en awk
la source
la source
Fonctionnalités:
ls
avec un tri ou--color=always
la source