• # revoilà ton script perdu, sous la même licence que Perl (GPLv1+|Artistic licence)

    Posté par . En réponse au journal Retour à l'interface Console. Évalué à 4.

    #!/usr/bin/perl
    use v5 ;
    use strict ;
    ######################
    # User configuration #
    ######################
    my $temporary_file = "/tmp/list_findduplicate_md5" ;
    # can be any of the control sum programs from coreutils:
    # cksum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, md5sum
    # could be sha3 as well the day GNU decides to add it to coreutils.
    my $hash_program = "md5sum" ;
    #my $hash_program = "/usr/local/bin/messageid.sh" ;
    # program must display the name of the file after its sum.
    # When using cksum only the crc32 sum is used, not the byte count.
    ########
    # Main #
    ########
    sub help {
     my $help_string="
    Syntax : ./findduplicate.pl
    Will list files in current directories and subdirectories,
    and display the location of the files which are duplicates,
    based on their hash calculated by ${hash_program}.
    Author: XXXXXXXXXXXX, <xxxxxxxxxxxx\@xxxxxxx>
    Date: 19 May 2013
    " ;
     print $help_string ;
     exit (0) ;
    }
    help() unless ($#ARGV == -1) ;
    my ($line) ;
    my (@params) ;
    my ($formersum, $currentsum) ;
    my ($formername, $currentname) ;
    my ($count) = 0 ;
    my ($s1, $s2) ;
    # Fichier contenant les sommes de contrôle de tous
    # les fichiers du répertoires et des sous-répertoires,
    # classées par ordre alphabétique de la somme de contrôle
    system ("find . -type f -exec ${hash_program} \"{}\" \";\" | sort > ${temporary_file}") ;
    open INPUT, "<", $temporary_file ;
    $formersum = "" ;
    while ($line = <INPUT>) {
     # Dans cette boucle on lit une somme de contrôle
     # depuis le fichier, et on compare à la précédente.
     # C'est ce qui définit un fichier dupliqué.
     chomp $line ;
     @params = split / /, $line ;
     $currentsum = $params[0] ;
     $currentname = $params[$#params] ;
     #print "##${formersum} -- ${currentsum}**\n" ;
     if ("${formersum}" eq "${currentsum}") {
     $s1 = -s ${formername} ;
     $s2 = -s ${currentname} ;
     # Dans le cas où on utilise messageID.sh, on peut
     # avoir des fichiers dupliqués de taille différente.
     # Par convention on écrit le plus petit en premier.
     # Dans les autres cas (md5, crc32), les fichiers
     # détectés comme dupliqués ont nécessairement la
     # même taille, la première comparaison étant alors
     # toujours vraie.
     #
     if ($s1 <= $s2) {
     print "diff -u ${formername} ${currentname}\n" ;
     } else {
     print "diff -u ${currentname} ${formername}\n" ;
     }
     #print "mv ${formername} dup/\n" ;
     $count = $count + 1 ;
     }
     $formersum = $currentsum ;
     $formername = $currentname ;
    }
    if ($count == 0) {
     print "No duplicates found\n" ;
    }
    #elsif ($count == 1) {
    # print "One duplicate found\n" ;
    #} else {
    # print "$count duplicates found\n" ;
    #}
    # On the target system, asks for enter
    # Useful on a specific machine where the script
    # is run from a graphical menu and must wait for
    # user to read the results before existing.
    #
    #print "Press Enter to exit\n" ;
    #<> ;
    __END__```