Trouver les doublons dans une liste de fichiers

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 651 fois - Téléchargée 17 fois

Contenu du snippet

Bonjour à tous.

Je passe à cette fonction une liste de fichiers et elle me retourne un tableau des doublons trouvés.

Source / Exemple :


<pre>
    <?php

    function compareFiles($files) {
        // On hache le fichier et on utilise cette valeur comme index d'un tableau.
        // Ainsi, les fichiers identiques sont automatiquement regroupés.
        $hash = array();
        foreach ($files as $value) {
            $hash[hash_file("md5", $value)][] = $value;
        }
        $tmp = array();
        //On ne récupère que les doublons.
        foreach ($hash as $value) {
            if (sizeof($value) > 1)
                $tmp[] = $value;
        }
        return $tmp;
    }

    //Test :
    $files = array("work/01.avi",
        "work/02.avi",
        "work/02_copie.avi",
        "work/03.avi",
        "work/04.wmv",
        "work/04_copie.txt", //Ca marche aussi si on change l'extension du fichier.
        "work/05.wmv",
        "work/05_copie.wmv");
    print_r(compareFiles($files));

    /* Voici le résultat obtenu :
      Array
          (
              [0] => Array
                  (
                  [0] => work/02.avi
                  [1] => work/02_copie.avi
                  )
              [1] => Array
                  (
                  [0] => work/04.wmv
                  [1] => work/04_copie.txt
                  )
              [2] => Array
                  (
                  [0] => work/05.wmv
                  [1] => work/05_copie.wmv
                  )
          )

  • /
?>

Conclusion :


Voilà. C'est super gourmand en ressources avec de gros fichiers (j'ai testé avec des vidéos), mais ça a l'air de bien marcher. A utiliser avec parcimonie à mon avis, et pas tel quel.

C'est la première fois que je poste une source et comme plein de gens j'apprends sur le tas, du coup je suis preneur pour tout commentaire qui me permettrai de m'améliorer!

A voir également

Ajouter un commentaire

Commentaires

Messages postés
9
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
2 décembre 2010

C'est joliment dit!!!
Je m'autorise un lol!!!
Messages postés
60
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
3 janvier 2011

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 ;-)
Messages postés
9
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
2 décembre 2010

@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
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
@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 ^^
Messages postés
60
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
3 janvier 2011

@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.
Afficher les 20 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.