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
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.
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
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.