Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1428 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  rechercher les doublons

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

rechercher les doublons

n°2119836
paul-inn
Posté le 06-01-2012 à 02:18:47  profilanswer
 

Bonjour,
 
S'il suffisait simplement de rechercher les doublons dans un même répertoire, ça serait facile .... mais ça n'est pas de ça qu'il s'agit  :non:  
 
 
 
J'ai un répertoire qui contient plusieurs milliers de fichiers, répartis dans des centaines de sous-dossiers, pour un total de .... 300 Go environ.
Les fichiers sont de tout type.
Certains sont en double, en triple, et peut-être même +.
 
Le but du schmilblick est de les retrouver (automatiquement), et de les supprimer (manuellement).
 
 
La piste qui me passe par la tête est celle-ci :
1) lister tous les fichiers de tous les répertoire et sous-répertoire, avec le chemin d'accès complet.
* C'était tentant de voir du côté de "ls -R" , mais manque de bol le chemin d'accès serait indiqué pour chaque répertoire et non pour chaque fichier
* un basique "find *" fait donc mieux l'affaire. (Et évidemment on écrit le tout dans un fichier : "find * > liste.txt" )
 
(j'ai pas trouvé dans le man ls l'option miraculeuse qui permet d'afficher le chemin complet pour chaque fichier)
 
 
2) à partir de là j'aimerai que devant chaque ligne de liste.txt, ça soit indiqué la taille en octet.
là, ma mémoire flanche un peu. Comment on fait pour écrire quelque chose devant chaque ligne ? Et c'est quelle commande pour afficher la taille d'un fichier (un à un) en octet ?
 
Pour plus de commodité (voir plus loin), je pense qu'il faudrait séparer la taille et le chemin d'accès par un "," ou un ";".
 
 
3) ensuite il faudrait trier cette jolie longue liste (croissant ou décroissant, on s'en fout)
"sort -n liste.txt" ?
 
 
4) et, idéalement, il faudrait qu'à partir de liste.txt on puisse extraire les lignes dont la taille apparait en double (ou triple etc).
D'où l'utilité du "," ou ";" qui sépare la taille du chemin du fichier
 
Exemple : dans le fichier doublons.txt on aurait
213456 ; ./Documents/xxx/yyy/zzz/fichier-du-20110201.bla
213456 ; ./Documents/xxx/abc/mmm/oki/fichier-du-20110201.bla
213456 ; ./Documents/aaaaa/w/qsdf/fichier.bla
11209 ; ./Documents/prouik.plouf
11209 ; ./Documents/pppppppp/azeazea/prouiiiiik.plouf
etc....
 
 
A partir de là, c'est moi, manuellement, selon mon ressenti par rapport au nom du fichier et à son chemin, qui déciderai de copier telle ligne et de la coller dans un autre terminal avec un rm devant (pour l'effacer donc)
 
 
Note 1 :
Je me doute bien que la taille seule ne garantie pas que ce soit un doublons ou non. Mais j'en prends ma responsabilité et j'en fait mon affaire pour effacer manuellement (ou pas) les fichiers de mon choix
 
Note 2 :
J'ai oublié de préciser que je suis sous MAC OS X ;-)
(mais bon, ça ne devrait pas être très perturbant)
 
Note 3 :
Qui pourrait m'aider à pondre les lignes de commande adéquat pour ce dont j'ai besoin (ou ce que je souhaite faire) ?
 
 
Merci pour votre aide.
 
 

mood
Publicité
Posté le 06-01-2012 à 02:18:47  profilanswer
 

n°2119837
Profil sup​primé
Posté le 06-01-2012 à 04:36:21  answer
 

salut,
 

Code :
  1. find repertoire/ -type f -printf '%s %p\n' | sort -n | less #pour une visualisation immédiate, ou >fichier

n°2119903
paul-inn
Posté le 06-01-2012 à 12:04:13  profilanswer
 

Merci watael pour cette réponse claire et rapide ...
 
Juste un mini-bémol : ça ne fonctionne pas car -printf est inconnu  (est-ce dû au fait que je sois sous MAC OS X ?)

n°2119929
Profil sup​primé
Posté le 06-01-2012 à 13:44:50  answer
 

sous réserve que stat soit disponible, et qu'il le soit avec les mêmes options, sur mac

Code :
  1. find repertoire/ -type f -exec stat -c'%s %n' {} \;

n°2119931
paul-inn
Posté le 06-01-2012 à 13:55:59  profilanswer
 

encore raté :-(
 
Grrr
 
 
 
$ find Documents/ -type f -exec stat -c'%s %n' {} \;
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
...

n°2119941
Profil sup​primé
Posté le 06-01-2012 à 14:24:38  answer
 

sur la page man de GNU stat

Citation :

-c, --format=FORMAT

sur mac peut-être est-ce -f


Message édité par Profil supprimé le 06-01-2012 à 14:25:08
n°2120085
Sve@r
Posté le 07-01-2012 à 20:02:43  profilanswer
 

paul-inn a écrit :


(j'ai pas trouvé dans le man ls l'option miraculeuse qui permet d'afficher le chemin complet pour chaque fichier)


Salut
Pas besoin d'option pour une commande X quand on peut le faire avec une commande Y

Code :
  1. find . -print


 

paul-inn a écrit :

A partir de là, c'est moi, manuellement, selon mon ressenti par rapport au nom du fichier et à son chemin, qui déciderai de copier telle ligne et de la coller dans un autre terminal avec un rm devant (pour l'effacer donc)


Pourquoi faire de l'à peu près ??? Tu as cmp qui t'indique si 2 fichiers sont identiques ou pas...


Message édité par Sve@r le 07-01-2012 à 20:03:11
n°2120277
paul-inn
Posté le 09-01-2012 à 16:30:13  profilanswer
 

Effectivement, cmp indique si 2 fichiers sont identiques ou pas.
 
Reste plus qu'à trouver comment cmp peut comparer X milliers de fichiers, tous avec des chemins d'accès différents, et bien entendu de manière automatique ;-)

n°2120479
Sve@r
Posté le 10-01-2012 à 13:13:08  profilanswer
 

paul-inn a écrit :

Effectivement, cmp indique si 2 fichiers sont identiques ou pas.
 
Reste plus qu'à trouver comment cmp peut comparer X milliers de fichiers, tous avec des chemins d'accès différents, et bien entendu de manière automatique ;-)


 
Soyons franc. L'algo de base serait
- je prends le premier fichier
- je compare ce fichier avec tous les autres
- je prends le second fichier
- je compare ce fichier avec tous les autres
etc etc. Mais pour n fichiers tu feras n*n comparaisons. Pas viable
 
Un algo plus fin pourrait être le suivant
1) tu établis une liste de fichiers triée par tailles. Ainsi "n" fichiers de taille identique seront placés ensemble dans la liste
2) tu mets en place 2 pointeurs: un pointeur vers le fichier en cours et un pointeur vers les fichiers suivants
3) tu décales ton pointeur courant vers le fichier suivant et tu places ton pointeur suivant au même niveau
4) tu décales le pointeur suivant sur le fichier suivant.
5) S'il a la même taille que le courant alors tu compares le courant et le suivant et tu agis en conséquence puis retour en 4
6) Si les tailles sont différentes, alors retour en 3
 
Ainsi, tu ne compares que les fichiers qui ont la même taille...

n°2315516
groslulu
Posté le 22-05-2018 à 08:49:10  profilanswer
 

Sve@r a écrit :


Bonjour,
Je me suis inspiré de cette discussion pour faire du ménage dans mes disques, et je crois avoir trouvé la commande ultime :
find /media /home /run/user/1000/gvfs -size +200M -type f  -printf '%s ;%c; ' -exec  /usr/bin/md5sum {}  \; |sed -e 's/ ./;/g'|sort -n -t";" -k1,3 > gros_fichier_doublons.csv
 
C'est très long (4h pour 2 disques de sauvegarde + /home), mais ça m'a libéré 230 Go !
 
 
 
Soyons franc. L'algo de base serait
- je prends le premier fichier
- je compare ce fichier avec tous les autres
- je prends le second fichier
- je compare ce fichier avec tous les autres
etc etc. Mais pour n fichiers tu feras n*n comparaisons. Pas viable
 
Un algo plus fin pourrait être le suivant
1) tu établis une liste de fichiers triée par tailles. Ainsi "n" fichiers de taille identique seront placés ensemble dans la liste
2) tu mets en place 2 pointeurs: un pointeur vers le fichier en cours et un pointeur vers les fichiers suivants
3) tu décales ton pointeur courant vers le fichier suivant et tu places ton pointeur suivant au même niveau
4) tu décales le pointeur suivant sur le fichier suivant.
5) S'il a la même taille que le courant alors tu compares le courant et le suivant et tu agis en conséquence puis retour en 4
6) Si les tailles sont différentes, alors retour en 3
 
Ainsi, tu ne compares que les fichiers qui ont la même taille...



---------------
Les cons ça ose tout ...  
mood
Publicité
Posté le 22-05-2018 à 08:49:10  profilanswer
 

n°2316234
lndetroie
Posté le 31-05-2018 à 16:55:50  profilanswer
 

Salut tout le monde !  :hello:  
 
Alors moi ça fait des années que je code plus... Du coup j'arrive à comprendre les lignes de code mais j'arrive pas à traduire l'algorithme ci-dessus en code (celui qui compare les tailles) ; quelqu'un pour m'aider ? :)
 
 
Merci d'avance !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  rechercher les doublons

 

Sujets relatifs
Rechercher les csv d'un répertoire et import dans des tables AccessCompter le nombre de doublons d'un tableau
Visual Basic : Rechercher la combinaison d'un nombreSupprimer les doublons
rechercher des donnes dans Bd oracle à partir de jsfGestion doublons sqlloader
Supprimer doublons dans un vectorEliminer doublons sur base de données
rechercher extension dans repertoire puis déplacer dans dossierRechercher les doublons dans une table?
Plus de sujets relatifs à : rechercher les doublons


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR