web-dev-qa-db-fra.com

Quelle est la façon la plus rapide de trouver des fichiers en double?

J'ai trouvé cette commande utilisée pour trouver des fichiers dupliqués mais elle était assez longue et m'a rendu confus. Par exemple, si je supprime -printf "% s\n", rien n'est sorti. Pourquoi ça? D'ailleurs, pourquoi ont-ils utilisé xargs -I {} -n1? Existe-t-il un moyen plus simple de rechercher des fichiers en double?

[4a-o07-d1:root/798]#find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
0bee89b07a248e27c83fc3d5951213c1  ./test1.txt
0bee89b07a248e27c83fc3d5951213c1  ./test2.txt
30
The One

Vous pouvez le raccourcir:

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD

Faire md5sum des fichiers trouvés sur le -exec action de find puis sort et faites uniq pour obtenir les fichiers ayant le même md5sum séparés par une nouvelle ligne.

45
heemayl

Vous pouvez utiliser fdupes . De man fdupes:

Recherche le chemin donné pour les fichiers en double. Ces fichiers sont trouvés en comparant les tailles de fichiers et les signatures MD5, suivis d'une comparaison octet par octet.

Vous pouvez l'appeler comme fdupes -r /path/to/dup/directory et il imprimera une liste de dupes.

Mise à jour

Vous pouvez également essayer fslint également. Après avoir configuré fslint, accédez à cd /usr/share/fslint/fslint && ./fslint /path/to/directory

39
Rahul

Dans le cas où vous souhaitez comprendre la commande d'origine, allons-y bien que pas à pas.

find -not -empty -type f

Recherchez tous les fichiers non vides dans le répertoire actuel ou l'un de ses sous-répertoires.

   -printf "%s\n"

Imprimez sa taille. Si vous supprimez ces arguments, il imprimera des chemins à la place, interrompant les étapes suivantes.

 | sort -rn

Trier numériquement (-n), dans le sens inverse (-r). Cependant, le tri dans l'ordre croissant et la comparaison sous forme de chaînes et non de nombres devraient tout aussi bien fonctionner. Vous pouvez donc supprimer le -rn drapeaux.

 | uniq -d

Recherchez les lignes consécutives en double et ne conservez que celles-ci.

 | xargs -I{} -n1

Pour chaque ligne d'entrée (c'est-à-dire chaque taille qui se produit plus d'une fois), exécutez la commande suivante, mais remplacez {} par la taille. Exécutez la commande une fois pour chaque ligne d'entrée, au lieu de passer plusieurs entrées à une seule invocation.

   find -type f -size {}c -print0

Voici la commande à exécuter pour chaque taille: recherchez dans le répertoire courant des fichiers qui correspondent à cette taille, donnés en caractères (c) ou plus précisément en octets. Affiche tous les noms de fichiers correspondants, séparés par des octets nuls au lieu de nouvelles lignes afin que les noms de fichiers qui contiennent des nouvelles lignes soient traités correctement.

 | xargs -0 md5sum

Pour chacun de ces noms séparés par des valeurs nulles, calculez la somme de contrôle MD5 dudit fichier. Cette fois, nous autorisons le passage de plusieurs fichiers à une seule invocation de md5sum.

 | sort

Trier par sommes de contrôle, car uniq ne prend en compte que les lignes consécutives.

 | uniq -w32 --all-repeated=separate

Trouvez les lignes qui correspondent dans leurs 32 premiers octets (la somme de contrôle; après cela vient le nom du fichier). Imprimez tous les membres de ces séries de doublons, avec des séries distinctes séparées par des retours à la ligne.

Comparé à la commande la plus simple suggérée par heemayl , cela a l'avantage de n'utiliser que les fichiers de contrôle qui ont un autre fichier de la même taille. Il paie pour cela avec des appels répétés find, traversant ainsi plusieurs fois l'arborescence de répertoires. Pour ces raisons, cette commande est particulièrement bien adaptée aux répertoires contenant peu mais de gros fichiers, car dans ces cas, éviter un appel de somme de contrôle peut être plus important que d'éviter la traversée répétée de l'arborescence.

15
MvG