Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Déduplication de fichiers

2 réponses
Avatar
Kevin Denis
Bonjour,

j'ai plusieurs répertoires plats (sans sous-répertoires) qui ont
plusieurs centaines de fichiers chacun.

Je cherche un moyen simple qui me donnerait la liste des fichiers
en double dans chacun de ces répertoires.

J'ai donc écrit:
#! /bin/bash
OLD_MD5=nonexistent
for liste in `ls -1 | xargs md5sum | sort | sed s/\ \ /:/g`
do
MD5=`echo $liste | cut -d ":" -f1`
[ "$MD5" = "$OLD_MD5" ] && echo $liste | cut -d ":" -f2
OLD_MD5="$MD5"
done

qui fonctionne pas trop mal lorsque les fichiers sont parfaitement
identiques. En première passe, c'est très rapide et fiable.

Néanmoins, ces fichiers proviennent de plusieurs plateformes (mac, win,
linux) et j'ai pas mal de problèmes concernant les fins de fichiers et
les fins de lignes.

Ainsi, un fichier peut se terminer par \r\n, \r, \n. Bien évidemment,
les md5sum sont différents.

De plus, certains fichiers de plusieurs lignes peuvent différer
uniquement par des ajouts de ligne vides (entre chaque ligne, ou en
fin de fichiers).

Ma question:
Y'a t'il une méthode pour trouver tous les fichiers identiques?
Le but est uniquement de les lister pour traitement futur.

Merci
--
Kevin

2 réponses

Avatar
Manuel Pégourié-Gonnard
Kevin Denis scripsit:

Néanmoins, ces fichiers proviennent de plusieurs plateformes (mac, win,
linux) et j'ai pas mal de problèmes concernant les fins de fichiers et
les fins de lignes.

Ainsi, un fichier peut se terminer par rn, r, n. Bien évidemment,
les md5sum sont différents.



Par contre, diff avec les bonnes options devrait se rendre compte qu'ils
sont identiques.


--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Avatar
Stephane CHAZELAS
2009-05-25, 13:14(+00), Kevin Denis:
Bonjour,

j'ai plusieurs répertoires plats (sans sous-répertoires) qui ont
plusieurs centaines de fichiers chacun.

Je cherche un moyen simple qui me donnerait la liste des fichiers
en double dans chacun de ces répertoires.

J'ai donc écrit:
#! /bin/bash
OLD_MD5=nonexistent
for liste in `ls -1 | xargs md5sum | sort | sed s/ /:/g`
do
MD5=`echo $liste | cut -d ":" -f1`
[ "$MD5" = "$OLD_MD5" ] && echo $liste | cut -d ":" -f2
OLD_MD5="$MD5"
done

qui fonctionne pas trop mal lorsque les fichiers sont parfaitement
identiques. En première passe, c'est très rapide et fiable.

Néanmoins, ces fichiers proviennent de plusieurs plateformes (mac, win,
linux) et j'ai pas mal de problèmes concernant les fins de fichiers et
les fins de lignes.

Ainsi, un fichier peut se terminer par rn, r, n. Bien évidemment,
les md5sum sont différents.

De plus, certains fichiers de plusieurs lignes peuvent différer
uniquement par des ajouts de ligne vides (entre chaque ligne, ou en
fin de fichiers).

Ma question:
Y'a t'il une méthode pour trouver tous les fichiers identiques?
Le but est uniquement de les lister pour traitement futur.


[...]

Avec des outils GNU:

md5sum * | sort | uniq -D -w32

si tu consideres identiques deux fichiers qui different par les
types de sauts de ligne et le nombre de lignes vides, tu peux
les /normaliser/ avant, par exemple en enlevant les lignes vides
et changer les sauts de lignes en n:

for f in *; do
tr -s 'rn' 'nn' < "$f" | md5sum | {
read a b && printf '%sn' "$a $f"
}
done | sort | uniq -D -w32

--
Stéphane