TROUVER LES DOUBLONS DANS UNE LISTE DE FICHIERS

Vonscott Messages postés 61 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 19 septembre 2011 - 23 nov. 2010 à 18:26
cs_soobook Messages postés 9 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 2 décembre 2010 - 2 déc. 2010 à 19:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52503-trouver-les-doublons-dans-une-liste-de-fichiers

cs_soobook Messages postés 9 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 2 décembre 2010
2 déc. 2010 à 19:06
C'est joliment dit!!!
Je m'autorise un lol!!!
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
1 déc. 2010 à 13:10
Meuh non on n'est pas déçus. Au contraire, j'applaudis cette belle transparence teintée d'humilité.
Donc comme évoqué un peu longuement, php n'est pas forcément l'outil répondant le mieux au besoin évoqué, mais bon, si ça le fait ;-)
cs_soobook Messages postés 9 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 2 décembre 2010
1 déc. 2010 à 09:09
@neigedhiver : ne vous inquiétez pas, je vais pas faire la gueule. Le truc c'est juste que j'ai un goût immodéré pour les débats, du coup après je perd un temps fou à répondre dans les forums!!!

En fait je ne comprend que superficiellement vos derniers posts. Faut que je relise une ou deux fois et que je cherche sur le net.
Honnêtement, j'ai suffisamment à apprendre avec PHP/JS/CSS/HTML pour l'instant. Je comprend l'importance de tout ça, mais j'y suis pas encore.

Quand au contexte de la source, il est tout con. J'ai un dossier de quelque centaines d'images dont je dois faire une galerie. Sauf qu'il y a plein de doublons. J'ai donc écris ce script pour nettoyer mon dossier.
Je récupère la liste des doublons et je l'affiche avec des miniatures (et je ne suis pas tombé sur deux images différentes avec le même hash).
Grâce à des boutons radios je choisis l'exemplaire à conserver, puis je supprime les autres.
Il s'agit donc d'un script d'administration qui ne sera utilisé que très ponctuellement (voire plus jamais).

Je pense que cette source n'est intéressante que pour un débutant, pour les deux concepts suivants, que perso j'ai compris il n'y a pas si longtemps :
- hasher des choses pour les comparer.
- utiliser l'index d'un tableau pour trier facilement des choses.
C'est simpliste, mais c'est clair (en tout cas je trouve). C'est pour ça que je l'ai posté.

Je suis sur que vous êtes tous déçus!!! :-D
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
29 nov. 2010 à 22:58
@HornetBzz : je n'ai pas été "dérouté", mais je voulais apporter ces précisions pour que, justement, un débutant, un profane, ne soit pas dérouté ou confus et ne se croie limité par l'utilisation de PHP. Ça n'avait rien de personnel ;)
Je ne recommande pas forcément PHP non plus pour des tâches d'admin. Cependant, pour l'avoir moi-même utilisé à une époque de cette manière, il me paraît important de préciser qu'on peut quand même et que ça n'a rien de monstrueux. Quand PHP est le seul langage qu'on maîtrise, il est tout à fait légitime de l'utiliser à la place d'un autre langage qu'on ne connait pas et qui serait pourtant plus adapté.
Parce que si PHP est facile d'accès aux débutants, ce n'est pas vraiment le cas de bash ou de perl qui n'ont pas pour vocation la lisibilité, mais la concision (laquelle est généralement au détriment de la lisibilité).
Je rappelle juste que :
On peut écrire des applications graphiques avec bash, on peut même faire un site web avec. De même avec Python, Perl, Rubis, PHP : tous ces langages peuvent s'utiliser aussi bien en ligne de commande, qu'en module/extension de serveur web ou de moteur d'application avec GUI... A chacun de voir selon ce qu'il a à faire le langage le plus adapté, en fonction des capacités, des contraintes de l'environnement de dév/prod, etc.

J'arrête là pour le HS, SooBook va finir par faire franchement la gueule ^^
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
29 nov. 2010 à 22:38
@neigedhiver:
tu joues un peu sur les abus de languages dont j'ai effectivement usé et qui t'ont visiblement dérouté...
Moi aussi j'utilise du php-cli en cron mais franchement, il y a souvent mieux à faire. Donc ce n'est pas le genre de "conseil" que j'étalerai.
Et oui, c'est sûr... tout est possible : on peut aussi créer un site web en netcat si on veut. Mais vu le script en question, ce n'est pas une question de honte ou pas, je me permet juste de douter un peu des possibilités de gérer les aspects sécurité avec de l'admin en php-cli.

D'où une préférence nette et affichée pour le distingo suivant: php<=> servir des pages web, shell (bash/perl...) <=> admin, et eventuellement un cgi s'il y avait une "passerelle" à établir. Et non, cgi n'est pas un langage... Merci pour cette info qui m'avait visiblement échappé.

Quand on écrit ce genre de script en php, ça laisse présager un serveur sur lequel on n'a pas franchement la main, et pour lequel PHP vient à la rescousse, en constituant un embryon de solution, mais il n'en reste pas moins que bash/perl/python sont mieux adaptés que php selon moi (C'est mon seul message, certes peut-être mal exprimé)
Ah si, sauf si tu inclus ssh2 (pecl) dans php :-). Allez stop, je diverge (en un mot).

J'espère que c'est plus clair et que tu auras noté le ton plus humoristique qu'ironique. N'oublions pas qu'il est bon de rire parfois !

@soobook
Le code en lui-même me semble très bien écrit.
Mais j'avoue ne pas bien comprendre l'intérêt de ton source, car comparer des fichiers, c'est bien... mais dans quel but/contexte ? Il faudrait que tu précises un peu.
Si c'est pour de l'admin, comme tu as justement remarqué, les ressources consommées sont lourdes. D'où la suggestion de la création d'une liste des fameux doublons par un cronjob (en bash/perl ou même ton script quasiment tel quel..). Quitte à récupérer cette liste en php dans ton interface web. Mais éviter de mélanger l'interface web avec le besoin de créer la liste des doublons. Et lancer une mise à jour de la fameuse liste à l'instant t, mais toujours moins lourd que de créer intégralement en Live la liste en question. C'est juste une idée. Encore une fois, tout dépend du contexte et de l'objectif.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
29 nov. 2010 à 21:00
@HornetBzz : "donc du perl ou du shell, mais pas du php. ou au pire un cgi."
Un CGI en quel langage ? Perl, bash, python, ruby, java, ... ?
CGI n'étant pas un langage de script... Shell non plus d'ailleurs.

Juste pour info : un script PHP peut aussi être exécuté avec cron, je vois pas où est le problème. Certains utilisent PHP comme langage de script pour des tâches d'admin sur un serveur, il n'y a aucune honte à ça : ce n'est certes pas la vocation première de PHP, mais bon, c'est quand même possible.
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
29 nov. 2010 à 18:02
je n'ai pas du tout comprendre mais pour moi, le but de ce script est de réaliser de l'admin, donc du perl ou du shell, mais pas du php. ou au pire un cgi.
Comme tu dis, c'est le genre de manip gourmandes en ressources, donc perl ou shell te permettraient une execution en cronjob et ainsi, si tu veux garder ton php, alléger l'execution qui ne s'opérera que sur les éléments de la liste non dédoublonnée.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
29 nov. 2010 à 14:31
@Soobook : du coup, je sais pas, parce que j'ai pas regardé ton code source en détail. J'ai juste survolé, au début, les commentaires, notamment ceux de Kohntark, qui m'ont permis de comprendre comment tu avais écrit ton code etc. Je lui fais confiance, la source n'est pas suffisament complexe (ce n'est pas péjoratif) pour qu'il y ait des choses à explorer que K. n'aurait pas vues, à priori.

La digression que j'ai fait ici (j'en assume la responsabilité) vient du fait qu'on ne peut pas le faire ailleurs. Les forums de CS sont suffisament mal foutus pour que les discussions sur du long terme ne peuvent réellement exister, d'ailleurs, c'est tout juste si elles auraient une place où être... Alors il reste les commentaires des sources, des tutos, et les discussion du forum éphémères qui s'éteignent en moins d'une semaine pour la plupart.

@LeFauve42 : faut pas se leurrer... Des nouvelles fonctionnalités sur CS, c'est pas pour demain... Depuis le temps que j'y suis, les nouveautés que j'ai vues sont presque insignifiantes : liste de ses sources, redimensionnement du textarea pour poster sur le forum, prévisualisation sur le forum... J'ai pas souvenir avoir vu autre chose...
LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 avril 2009
29 nov. 2010 à 11:13
Bonjour,

> Il n'y a pas 36 manières de tester si un fichier est identique à un autre. Le hash est l'une des seules solutions.

Le hash ne permet pas de tester que deux fichiers sont identiques. Il permet de tester qu'ils sont differents (si ils ont un hash different) mais deux fichiers peuvent tres bien avoir un hash identique et etre differents.

Je pense que tu peux accelerer grandement ton programme en commencant par tester les tailles des fichiers (si la taille de deux fichiers est differente, ils sont forcement differents).
Ensuite, tu peux hasher les fichiers de taille identiques (si il y en a) pour voir si ils sont differents.
En toute rigueur, si tu veux vraiment etre sur, quand tu trouves plusieurs fichiers avec un hash identique, tu devrais les comparer deux par deux octet a octet (c'est le seul moyen exhaustif de comparer deux fichiers).

> Les mêmes questions : "comment modifier le contenu d'une liste s...
> Les mêmes problèmes : problème de soumission de formulaire, prob...
> Les mêmes comportements : ceux qui débarquent sans dire bonjour et ...
> Et il faut y ajouter tous les problèmes qui pourraient être résolus...

Comme je te comprend :o)

Est-ce qu'on ne pourrait pas reduire sensiblement le probleme en :
- Redigeant un FAQ
- Banissant pour 48h du forum toute personne posant une question dont la reponse est dans le FAQ (avec un message leur expliquant pourquoi)

Je sais, c'est plus facile a dire qu'a faire, mais entre ca ou se retrouver avec un forum ininteressant ca vaut peut-etre le coup de se poser la question, quite a faire grincer quelques dents...

Eric
cs_soobook Messages postés 9 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 2 décembre 2010
29 nov. 2010 à 10:56
Bonjour.
J'ai renommé la source pour préciser un peu le contexte dans lequel je l'ai écrite.

@kohntark : ok (et merci) pour les snippets. Quant à ma classe, je vais voir, mais je crois pas qu'elle apporte grand chose de plus que la fonction...

@neigedhiver : et du coup vous en pensez quoi de ma source?

Tout cela n'a pas grand chose a avoir avec ma source. La chose de sûre c'est que ça ne me dérange pas si on la descend, tant que c'est justifié ET expliqué.

Concernant la redondance des forums, elle ne me dérange pas : perso toutes les explications ne me parlent pas, elle sont de plus rarement exhaustive. Quand je cherche quelque chose, je lis toujours plusieurs réponses, et ça me permet souvent d'envisager les choses sous des angles non envisagés. J'ai encore énormément de choses à apprendre.
Ce qui me gêne plus c'est la digression, ce que nous faisons ici :-). Chaque fois que l'on cherche quelque chose, on tombe sur des sujets de huit pages qui parlent de tout et de rien. Il est assez probable que les gens qui vont passer ici ne seront pas particulièrement à la recherche d'un débat.

Je veux surtout pas lancer un vieux débat, et j'ai aussi une forte tendance à digresser, du coup ça compte pour moi le premier.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
25 nov. 2010 à 22:25
Sur PHPCS, les habitués ne sont pas austères : ils sont las. Mais je trouve quand même gonflé de leur en imputer la responsabilité...
Personnellement, si je suis las de phpcs, c'est parce qu'on y trouve toujours les mêmes questions, les mêmes sources, les mêmes problèmes et, pire que tout, le même comportement.
Les mêmes sources : des dizaines pour mapper l'accès à mysql, des dizaines de sources pour mettre en place un livre d'or, gérer des permissions utilisateurs, la pagination des résultats. Dans ces sources, même pas 5% sont correctement écrites, sécurisées, faciles à intégrer, etc.
Les mêmes questions : "comment modifier le contenu d'une liste suivant ce qui est sélectionné dans une autre", "comment conserver les données d'une page à l'autre", et j'en passe.
Les mêmes problèmes : problème de soumission de formulaire, problème de requête sql, problème d'échapement de caractères sur les données issues de la bdd, etc (exemples tirés de la page d'accueil)
Les mêmes comportements : ceux qui débarquent sans dire bonjour et exigent une réponse rapide avec du code tout fait à leur premier message, ceux qui, justement, donnent du code tout fait aux boulets qui l'exigent, ceux qui ne répondent pas aux questions quand on cherche à les aider, etc j'en passe.
Et il faut y ajouter tous les problèmes qui pourraient être résolus si les personnes prenaient quelques minutes pour chercher dans la doc (qu'ils ne savent pas utiliser du fait qu'ils ne l'utilisent jamais), et tous ceux qui pensent que toutes les réponses sont sur le net et gratuites (non, les meilleurs tutoriaux qui existent s'appellent des livres et s'échangent en librairie contre des euros).

En ce qui me concerne, je n'ai aucun scrupule à "enterrer" un code, un tuto quand il est pourri. Je pense que c'est rendre service à son auteur que de lui dire qu'il n'a pas produit quelque chose de qualité. C'est de l'hypocrisie que de lui dire que c'est bien, merci de l'intention.
Mon expérience personnelle est la suivante : j'ai passé plusieurs années à chercher les réponses à mes problèmes dans les livres et dans les docs. Sans poser la moindre question sur le net (faut dire, à l'époque, c'était du 56k !). Et j'ai encore attendu quelques années avant de poster des sources sur le net. Ce que j'ai appris, je le dois essentiellement aux auteurs que j'ai rémunérés en achetant leurs livres et aux développeurs de PHP et MySQL qui ont rédigé les docs, ainsi qu'aux auteurs des spécifications et autres RFC. Très peu aux forums.

Alors les habitués austères, quand ils prennent un peu de recul et qu'ils constatent que 99% des personnes qui développent des sites web pour leur plaisir ne font aucun effort et attendent simplement que la solution leur arrive sans chercher vraiment, ben comme dirait Perceval : "On en a gros". Les habitués austères sont aussi passés par la case newbie. Mais s'ils ne sont pas restés dedans (parce que pour ma part j'estime avoir progressé depuis mon premier echo "Hello world !"), c'est parce qu'ils se sont sortis les doigts du cul et qu'ils ont cherché à apprendre, à solutionner leurs problèmes, etc.

L'habitué austère que je suis, en a un peu marre d'être considéré comme un habitué austère et aimerait bien que les boulets comprennent un peu son point de vue quand il massacre une source pourrie au premier commentaire ou qu'il envoit chier quand la personne n'a pas pris la peine de lire la doc d'une fonction avant de l'utiliser.

L'habitué austère que je suis vous souhaite une bonne soirée.
Vonscott Messages postés 61 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 19 septembre 2011
25 nov. 2010 à 22:06
Pas facile de trouver un bon forum
Entre allht...com avec ses pubs à tout va et une communautée disparue
Asp-p....net et son inorganisation desesperante
et phpcs avec ses habitués austeres qui s'excusent apres t'avoir enterré
Reste quoi ??????????????
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
25 nov. 2010 à 20:39
"Désolé, je voulais dire la meme chose: vérifier l'existence du MEME fichier"
Me doutais un peu, donc, dans le doute .... ^^

@soobook :
Neige a donné la réponse pour les snippets.
On pourrait traduire par : 'bout de code qui répond à une problématique "simple"'
'bout de code' n'a rien de réducteur, bien au contraire, et la fonction que tu proposes y aurait toute sa place.
Même s'il doit y a voir pas mal de classes de ce genre sur Cs je pense que tu devrais poster la tienne, en t'appuyant au besoin sur les manques des autres.

Cordialement,

Kohntark-
Vonscott Messages postés 61 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 19 septembre 2011
25 nov. 2010 à 20:03
"De toute façon ce genre de recherche ne devrait intervenir que dans un contexte d'administration"

Je suis pas tout à fait d'accord.
Pourquoi donner du boulot "long et chiant" à quelqu'un si le serveur peut le faire ???.
Une class peut tres bien verifier l'existence du fichier, si oui modifier le lien du nouveau upoload par celui du fichier deja existant
Vonscott Messages postés 61 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 19 septembre 2011
25 nov. 2010 à 19:58
@kohntark

""mais intégrée à une class pour vérifier l'existence d'un fichier sur le serveur cela parait pas mal."
Perso ça me parait horrible !! :)
Pour cela il y a is_file() et dérivés, qui ont une rapidité sans commune mesure avec cette fonction."

Désolé, je voulais dire la meme chose: vérifier l'existence du MEME fichier
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
24 nov. 2010 à 15:21
Les snippets c'est ici :
http://www.codyx.org/
cs_soobook Messages postés 9 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 2 décembre 2010
24 nov. 2010 à 07:37
Merci pour vos remarques et pour la note, c'est très sympa.

J'utilise le principe dans une petite classe qui analyse un répertoire et ses sous-dossiers pour trouver les doublons.
Je n'ai cependant posté que le principe sous la forme d'une fonction, le reste n'est pas très intéressant.

Kohntark, en fait je sais pas encore ce que signifie "poster ta fonction dans les snippets"!!! Je regarde sur le net et je ferais mieux la prochaine fois! :-)
Dav_c Messages postés 194 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 décembre 2015
24 nov. 2010 à 05:21
Sans tester.... Ne pas utiliser sur des videos, mais sur une base donner (format txt ou autres ) sa pourrais très bien marcher.
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
23 nov. 2010 à 22:01
Salut,

(je n'ai pas testé, juste lu)
"mais intégrée à une class pour vérifier l'existence d'un fichier sur le serveur cela parait pas mal."
Perso ça me parait horrible !! :)
Pour cela il y a is_file() et dérivés, qui ont une rapidité sans commune mesure avec cette fonction.

"A utiliser avec parcimonie à mon avis, et pas tel quel."
Bah non !
Il n'y a pas 36 manières de tester si un fichier est identique à un autre. Le hash est l'une des seules solutions.
Comme tu dis cela demande beaucoup de ressources, mais il n'y a pas trop le choix.
De toute façon ce genre de recherche ne devrait intervenir que dans un contexte d'administration, ce qui laisse la possibilité de "diluer" ces lourdes ressources.

J'aime bien ta façon de procéder, c'est (très) simple, concis, et efficace (pas testé cependant)
Certains ne manqueront pas de te dire que ce n'est pas une véritable source et que tu aurais dû poster ta fonction dans les snippets. Ils n'auront pas totalement tord.

Comme Vonscott je pense qu'une classe implémentant un système plus abouti serait préférable.

Cordialement,

Kohntark-
Vonscott Messages postés 61 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 19 septembre 2011
23 nov. 2010 à 18:26
Salut,

Je ne suis pas un expert php, je ne sais pas si cette fonction a déjà été présentée sur ce forum, mais je la trouve intéressante. Seule, elle présente un intérêt moyen, mais intégrée à une class pour vérifier l'existence d'un fichier sur le serveur cela parait pas mal.
Si vraiment c'est "super gourmand" est ce qu'un pro peut donner la solution ?

En tout cas, bonne idée pour moi, simple et efficace