web-dev-qa-db-fra.com

Comment supprimer des fichiers en double à l'aide de bash

J'ai un dossier avec duplicata (par md5sum (md5 sur un Mac)) Les fichiers et je veux avoir un emploi cron programmé pour supprimer tout trouvé.

Cependant, je suis coincé sur la façon de faire cela. 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 des doublons? Je ne me soucie pas vraiment lequel "Original" Je conserve - mais je veux seulement en garder un.

Devrais-je m'approcher de manière différente?

9
warren

Vous pouvez identifier des fichiers en double à l'aide de la commande suivante:

md5sum * | sort -k1 | uniq -w 32 -d
7
Marcin

J'ai couru à travers - fdupes comme une réponse à cette question similaire: https://superuser.com/questions/386199/how-a-remove-dupliquée-files-in-a-difice

J'étais capable de apt-get install fdupes sur Ubuntu. Vous voudrez certainement lire la page Man. Dans mon cas, j'ai pu obtenir les résultats souhaités comme:

fdupes -qdN -r /ops/backup/

Lequel dit "look de récursivement via/ops/Sauvegarde et trouvez tous les fichiers en double: conservez la première copie d'un fichier donné et supprimez tranquillement le reste." Cela facilite la conservation de plusieurs décharges d'une base de données infructueuse.

2
dannyman
md5sum * | sort -k1 | uniq -w 32 -d | cut -d' ' -f3 | xargs -I{} sh -c 'rm {}'
  1. prenez toutes les valeurs MD5
  2. triez-les afin que les dupes soient séquentielles pour UNIQ
  3. exécutez UNIQ pour produire des dupes uniquement
  4. couper le nom de fichier de la ligne avec la valeur MD5
  5. appelez à plusieurs reprises Supprimer sur les noms de fichiers
1
Carter Cole

Si vous êtes pressé (ou si vous avez beaucoup de fichiers) et que vous souhaitez éviter les frais généraux d'une sorte (cela prend du temps) mais ne vous dérangez pas la mémoire de la mémoire d'une table de hachage (ou si vous avez beaucoup de RAM avec vos lots des fichiers),

find . -type f -print0 | xargs -0 md5sum | awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }' | xargs -0 rm

find . -type f -print0: Trouver tous les fichiers et les sortir avec des noms de terminaison NULL

xargs -0 md5sum: Calculez les hachages en parallèle (ajustez -n max-args et -P Max-Procs à volonté, voir man xargs)

awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }': S'il y a une entrée dans la haquetable AWK contenant le MD5SUM, nous examinons actuellement, puis imprimez le nom de fichier que nous examinons actuellement, terminé par NULL. Sinon, ajoutez le nom de fichier à la table de hachage.

xargs -0 rm: prenez les chaînes terminées de NULL-in NULL et envoyez-les à RM.

Ceci est bien plus rapide que les FDUPES.

Si vous avez un nom de fichier contenant une nouvelle ligne, AWK le tronquera probablement à la nouvelle ligne depuis que MD5Sum sépare les enregistrements des nouvelles lignes.

Ceci est basé sur https://stackoverflow.com/questions/11532157/remove-duplicate-lines-without-sorting et https://stackoverflow.com/questions/9133315/Cow -Can-i-Sortie-Null-Terminé-Strings-in-Awk

1
Alex