Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/01/2009, à 16:50

abelthorne

[résolu] Trier des fichiers (identifier des doublons) ?

Bonjour,
Je cherche un logiciel, une commande ou un script qui me permettrait de trier des fichiers dans une arborescence : à partir d'un dossier donné, je voudrais obtenir un "rapport" me disant s'il y a des doublons au niveau des noms de fichiers (pas le contenu ! seulement le nom) dans toute la hiérarchie (sous-dossiers, sous-sous-dossiers...).
Le rapport en question doit simplement être la liste des fichiers en double avec leur chemin, je n'ai pas besoin d'infos particulières en plus.

Dernière modification par abelthorne (Le 24/01/2009, à 19:50)

Hors ligne

#2 Le 23/01/2009, à 17:04

Hoper

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Bonne exercice de script ca... pas si evident a faire je dirai...
Déjà tu peut partir de : "ls -1R . | sort"
qui si les noms de fichiers ne se ressemble pas tous, et si il n'y en a pas 10.000 peut te permettre de trouver assez vite les doublons. Mais pour faire le script complet qui les identifie vraiment lui meme... Ouai.. ca prendrait surement un peu de temps smile


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#3 Le 23/01/2009, à 17:10

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

C'est pour trier les doublons dans un pack d'icônes, donc avec des noms assez proches. Et j'en ai quand même environ 3400 à trier à terme (dans l'état actuel du pack, je n'en ai "que" 2650). Pour l'instant, j'ai utilisé la manière forte : création d'un dossier temporaire et copie du contenu de chaque sous-dossier au fur et à mesure pour voir si j'avais un message d'erreur "le fichier existe déjà", ce qui m'a permis d'identifier 3 doublons.

Je cherche une méthode un peu plus pratique pour les prochaines vérifications (au fur et à mesure que j'enrichirai le pack).

Dernière modification par abelthorne (Le 23/01/2009, à 17:13)

Hors ligne

#4 Le 23/01/2009, à 22:30

Sandrew

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Salut,

Fdupes permet de trouver les doublons. Dans les depots de Hardy.

++

Hors ligne

#5 Le 23/01/2009, à 23:40

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Ah, je vais voir ça.

Hors ligne

#6 Le 24/01/2009, à 12:57

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Bon ben ça ne va pas du tout : comme je le craignais, fdupes recherche les doublons de fichiers en fonction de leur contenu. Or, je cherche à chercher uniquement des doublons de noms, surtout pas de contenu.
Si j'ai des fichiers identiques mais avec un nom différent, c'est normal, ils ne doivent pas être recensés.
Je cherche à identifier des fichiers (et liens symboliques) qui auraient le même nom dans des dossiers différents, peu importe que leur contenu soit le même ou non.

Dernière modification par abelthorne (Le 24/01/2009, à 12:58)

Hors ligne

#7 Le 24/01/2009, à 13:03

Angelius

Re : [résolu] Trier des fichiers (identifier des doublons) ?

En espérant que cela puisse t'aider, il s'agit d'une commande : uniq :
Voici un tuto d'utilisation :
http://www.siteduzero.com/tutoriel-3-56528-extraire-trier-et-filtrer-des-donnees.html

Bon courage


Un moteur de recherche qui respecte votre vie privée ?--> Ixquick
Une messagerie instantanée libre et décentralisée ?--> Jabber
Ecouter et télécharger de la musique libre ?--> Jamendo

Hors ligne

#8 Le 24/01/2009, à 13:18

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Je ne suis pas sûr que ça m'aide beaucoup : soit je m'arrange pour récupérer uniquement les noms de fichiers et uniq pourra m'indiquer les doublons mais ça ne m'avance à rien puisque je n'aurai pas le chemin des doublons, soit je récupère le chemin complet des fichiers et uniq ne me trouvera pas de doublons puisque les lignes seront différentes (mimetypes/playlist.svg et places/playlist.svg, par exemple). hmm

Hors ligne

#9 Le 24/01/2009, à 13:54

Angelius

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Tu peux faire deux traitement, un qui te donne la liste des infos en double et un autre qui te donne les chemins des fichiers en passant par un fichier texte ou une pipe avec un peu d'habilité.

Je pense que ce que tu cherches doit exister sur le net, on va pas réinventer la roue mais je pense qu'un script sheel pourrait le faire

ls -l chemin | uniq -d ?

Dernière modification par Angelius (Le 24/01/2009, à 13:56)


Un moteur de recherche qui respecte votre vie privée ?--> Ixquick
Une messagerie instantanée libre et décentralisée ?--> Jabber
Ecouter et télécharger de la musique libre ?--> Jamendo

Hors ligne

#10 Le 24/01/2009, à 18:37

Sorciere

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Bonjour

Est-ce que ceci conviendrait ?

#!/bin/bash
ls -R $1 | sed '/^[[:blank:]]*$/d' | sort | uniq -d |
while read ligne
do echo $ligne
find $1 -name $ligne
echo
done

En tous cas, merci pour l'exercice (je débute en bash) smile

Edit : pour lancer le script : sh nom_du_script repertoire/a/traiter

Dernière modification par Sorciere (Le 24/01/2009, à 18:46)

Hors ligne

#11 Le 24/01/2009, à 19:25

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Ah oui, le script a l'air de marcher nickel. Merci !

Je me permets de demander une petite modification si ce n'est pas abuser (je ne sais pas utiliser sed) smile  : est-ce que ce serait possible de faire la même vérification mais sur le nom de fichier sans son extension (qu'il me trouve un doublon si j'ai playlist.svg et playlist.png quelque part dans des dossiers par exemple) ? Ce n'est pas indispensable mais si ça peut être fait facilement en changeant le filtre de sed, ça m'intéresse.

Hors ligne

#12 Le 24/01/2009, à 21:12

Sorciere

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Voilà :

#!/bin/bash
ls -R $1 | sed '{/^$/d;s/\(.*\)\.\([^\.]*\)/\1/}' | sort | uniq -d |
while read ligne
do echo $ligne
find $1 -name $ligne*
echo
done

Je ne savais pas non plus utiliser sed avant que tu ne poses ta question (et je suis toute bouffie d'orgueil d'y être arrivée wink ). Si ça t'intéresse, j'ai trouvé pas mal de choses ici : http://www.commentcamarche.net/faq/478-sed

Hors ligne

#13 Le 24/01/2009, à 21:30

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Ah, là par contre, ça marche moins bien. Par exemple :

network
areolae/scalable/status/network-transmit-receive.svg
areolae/scalable/status/network-offline.svg
areolae/scalable/status/network-receive.svg
areolae/scalable/status/network-idle.svg
areolae/scalable/status/network-transmit.svg
areolae/scalable/status/network-error.svg
areolae/scalable/status/network-wireless-encrypted.svg
areolae/scalable/devices/network-wireless.svg
areolae/scalable/devices/network-wired.svg
areolae/scalable/places/network-server.svg
areolae/scalable/places/network.svg
areolae/scalable/places/network-workgroup.svg
areolae/scalable/places/network_local.svg
areolae/scalable/places/network.icon
areolae/scalable/apps/network-config.png

Il considère que les doublons de "network" sont tous les fichiers network* et pas uniquement network.*

EDIT : ça a l'air de marcher en corrigeant la ligne 5 par find $1 -name $ligne.*

Encore merci !

Dernière modification par abelthorne (Le 24/01/2009, à 21:33)

Hors ligne

#14 Le 24/01/2009, à 23:24

Sorciere

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Effectivement, je n'avais pas envisagé ce cas.

Attention, ta correction ne fera pas sortir les fichiers sans extension ; et si tu as des points dans tes noms de fichiers, elle fera sortir toto.tata.png comme doublon de toto.png.

Pour les fichiers sans extension, tu peux juxtaposer deux find :
find $1 -name $ligne #retourne les fichiers sans extension
find $1 -name $ligne.* #retourne les fichiers avec extension

En revanche, je n'arrive pas à dire à find de prendre tous les fichiers dont le nom comporte un point et un seul.

Hors ligne

#15 Le 25/01/2009, à 01:39

Hoper

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Doublement bravo ! Pour avoir trouvé la commande "uniq" (dont j'ignorai l'existence) et pour avoir appris aussi vite à utiliser sed smile


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#16 Le 25/01/2009, à 11:58

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Sorciere a écrit :

Effectivement, je n'avais pas envisagé ce cas.

Attention, ta correction ne fera pas sortir les fichiers sans extension ; et si tu as des points dans tes noms de fichiers, elle fera sortir toto.tata.png comme doublon de toto.png.

C'est noté. Mais pour ce que j'ai à faire, ce n'est pas grave : les noms d'icônes ont forcément une extension et pas de points dedans.

J'ai remarqué que ma "correction" était un peu buggée quand j'ai vu deux ou trois cas où le script m'indiquait un seul fichier comme doublon. smile

Hors ligne

#17 Le 25/01/2009, à 17:22

Sorciere

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Ce truc m'agaçait, donc j'ai cherché encore un peu.
Je n'arrive décidément pas bien à utiliser find ; on m'a conseillé de passer par grep et ça fonctionne bien mieux.

#!/bin/bash
ls -R $1 | sed '{/^$/d;s/\(.*\)\.\([^\.]*\)/\1/}' | sort | uniq -d |
while read ligne
do echo $ligne
find $1 ! -type d -name $ligne
find $1 -name $ligne.* | grep "/$ligne\.[^.]*$"
echo
done

@abelthorne : j'espère qu'il n'est pas trop tard pour savoir si ça répond à tous les cas de figure.

@Hoper : je suis loin de maîtriser sed ! wink
Pour uniq, tout le mérite revient à Angelius que je remercie d'ailleurs pour le tuto qui mentionne qu'il faut travailler sur des fichiers triés, parce que ça ne figure pas dans le man-fr, contrairement au man-en.
Je suppose que le moment est venu pour moi d'apprendre à faire un rapport de bug...

Dernière modification par Sorciere (Le 25/01/2009, à 18:26)

Hors ligne

#18 Le 25/01/2009, à 18:02

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Sorciere a écrit :

@abelthorne : j'espère qu'il n'est pas trop tard pour savoir si ça répond à tous les cas de figure.

Oh non : je suis loin d'avoir fini de bosser sur mon pack d'icônes ; le script me servira encore plusieurs fois pour les nombreuses étapes qu'il me reste à faire. smile

Le nouveau a l'air de marcher comme il faut. Il y a juste un détail qui n'est peut-être pas voulu (mais qui n'a aucune incidence pour moi) : il intercepte aussi les noms de dossiers qui sont identiques aux noms de fichiers sans leur extension.
C'est à dire que j'ai un fichier scalable/mimetypes/image.svg et il l'indique en doublon avec le dossier scalable/stock/image.
Je le précise juste si tu cherches à comprendre où se fait cette assimilation (au niveau de grep ?), ce n'est pas du tout une demande d'amélioration. wink

Hors ligne

#19 Le 25/01/2009, à 18:25

Sorciere

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Décidément je ne pense pas à tout ! smile

Ce n'est pas le grep qui est en cause, mais la ligne précédente, qui ramène les noms de fichiers sans extension, et du coup les répertoires avec. Donc il suffit de lui dire de ne pas tenir compte des noms de dossier, en remplaçant find $1 -name $ligne par find $1 ! -type d -name $ligne.

J'édite mon post précédent et j'attends de savoir quel nouveau dysfonctionnement tu vas découvrir wink

Hors ligne

#20 Le 25/01/2009, à 20:35

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

J'édite mon post précédent et j'attends de savoir quel nouveau dysfonctionnement tu vas découvrir

Il ne prend plus en compte les dossiers pour l'affichage, par contre il doit les sélectionner quand même : dans la liste des doublons, j'ai
image
scalable/mimetypes/image.svg

Il n'affiche plus la ligne scalable/stock/image mais compte quand même le dossier dans les doublons.

Hors ligne

#21 Le 25/01/2009, à 23:57

Sorciere

Re : [résolu] Trier des fichiers (identifier des doublons) ?

@abelthorne : j'imagine que tu n'es pas forcément passionné par ma petite cuisine, je détaille juste au cas où quelqu'un bute sur le même problème. Et puis ça me servira d'aide-mémoire. Quoi qu'il en soit, merci pour les retours smile

Manifestement mon dossier de test ne prenait pas assez de cas en compte, donc cette fois-ci, je lui ai fait bouffer tout mon /home ! Et vu le temps que ça prend, je peux dire que ce script est passablement lourd (et/ou qu'il y a un bazar pas possible dans mes fichiers...).
Je n'ai plus de lignes orphelines, j'espère seulement qu'aucun fichier n'est omis.

Il ne prend plus en compte les dossiers pour l'affichage, par contre il doit les sélectionner quand même

Effectivement, ls retourne aussi les dossiers. Mais avec l'option --file-type, il ajoute un / derrière le nom des répertoires et du coup ils ne sont plus confondus avec les fichiers de même nom.

Je me suis aperçue qu'il ne digérait pas non plus les fichiers dont le nom comporte une espace, parce que je n'avais pas protégé mes variables avec des guillemets. C'est corrigé (y compris dans le sed, je n'en reviens pas d'arriver à faire fonctionner ce truc-là).

J'ai également omis les fichiers d'archive (ceux qui se terminent par ~) en ajoutant l'option -B à ls, considérant que ce ne sont pas des doublons à proprement parler.

Comme je risque de me tromper si j'édite pour semer des guillemets un peu partout, je reposte la totalité du script.

#!/bin/bash
ls -RB --file-type "$1" | sed '{/^$/d;/\(.*\)\//d;s/\(.*\)\.\([^\.]*\)/\1/}' | sort | uniq -d |
while read ligne
do echo "$ligne"
find "$1" ! -type d -name "$ligne"
find "$1" -name "$ligne.*" | grep "/$ligne\.[^.]*$"
echo
done

Dernière modification par Sorciere (Le 26/01/2009, à 00:45)

Hors ligne

#22 Le 26/01/2009, à 00:02

abelthorne

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Là, par contre, ça marche beaucoup moins bien : le script ne me retourne plus rien du tout (en utilisant le même dossier de départ qu'avant).

Une petite question par rapport à

J'ai également omis les fichiers d'archive (ceux qui se terminent par ~) en ajoutant l'option -B à ls, considérant que ce ne sont pas des doublons à proprement parler.

Le script est bien censé prendre en compte les liens symboliques comme des fichiers normaux ? Pour l'instant je n'en ai à priori pas en doublons pour le confirmer mais c'est très important pour mes besoins de tri.

Hors ligne

#23 Le 26/01/2009, à 00:45

Sorciere

Re : [résolu] Trier des fichiers (identifier des doublons) ?

Bon, manifestement j'ai besoin de bosser encore un peu sur sed... Enlève les guillemets qui sont dedans, c'était une mauvaise idée (j'édite le post précédent).

Du coup je signale que les fichiers dont le nom comporte une espace et un point ne sont pas traités correctement.

Pour les liens symboliques, honnêtement je ne sais, je n'y avais pas pensé, je n'ai pas testé. Je crains que ma manière de régler le cas des dossiers ne nuise aux liens hmm
Je pense que la version du post #17 les prend en compte, mais je veux bien une confirmation si tu en as l'occasion.

J'arrête pour ce soir, je n'ai plus les yeux en face des trous. Je ne sais pas exactement quand je pourrai m'y remettre, ayant un emploi du temps assez chargé dans les jours à venir, mais je n'abandonne pas, ce truc va finir par faire ce que je veux ! wink

Hors ligne