Question

Je suis en train d'écrire un script Perl (sous Windows) qui utilise File :: Find pour indexer un système de fichiers réseau. Il fonctionne très bien, mais il faut un temps très long pour explorer le système de fichiers. Je pensais que ce serait bien d'obtenir en quelque sorte une somme de contrôle d'un répertoire avant de traverser, et il la somme de contrôle correspond à la somme de contrôle qui a été prise sur une course précédente, ne traversent pas le répertoire. Cela éliminerait beaucoup de traitement, car les fichiers sur ce système de fichiers ne changent pas souvent.

Sur ma boîte AIX, j'utilise cette commande:

csum -h MD5 /directory

qui retourne quelque chose comme ceci:

5cfe4faf4ad739219b6140054005d506  /directory

La commande prend très peu de temps:

time csum -h MD5 /directory
5cfe4faf4ad739219b6140054005d506  /directory

real    0m0.00s
user    0m0.00s
sys     0m0.00s

Je l'ai recherché CPAN pour un module qui va le faire, mais il semble que tous les modules me donner le MD5sum pour chaque fichier dans un répertoire, pas pour le répertoire lui-même.

Y at-il un moyen d'obtenir la somme MD5 pour un répertoire en Perl, ou même dans Windows pour cette question que je pourrais appeler une commande Win32 de Perl?

Merci d'avance!

Était-ce utile?

La solution

Pouvez-vous lire les dernières dates de modification des fichiers et des dossiers? Sûrement que ça va être plus rapide que la construction MD5 de?

Autres conseils

Afin d'obtenir une somme de contrôle, vous devez lire les fichiers, cela signifie que vous aurez besoin de marcher le système de fichiers, qui vous met dans le même bateau que vous essayez de sortir.

D'après ce que je sais que vous ne pouvez pas obtenir un md5 d'un répertoire. md5sum sur d'autres systèmes se plaint lorsque vous fournissez un répertoire. csum est le plus susceptible de vous donner un hachage du contenu du fichier répertoire du répertoire de niveau supérieur, ne traversant l'arbre.

Vous pouvez saisir les temps modifiés pour les fichiers et les hachage que vous aimez en faisant quelque chose comme ceci:

sub dirModified($){
    my $dir = @_[0];
    opendir(DIR, "$dir");
    my @dircontents = readdir(DIR);
    closedir(DIR);

    foreach my $item (@dircontents){
        if( -f $item ){
            print -M $item . " : $item - do stuff here\n";
        } elsif( -d $item && $item !~ /^\.+$/ ){
            dirModified("$dir/$item");
        }
    }
}

Oui, il faudra un certain temps pour exécuter.

En plus des autres bonnes réponses, laissez-moi ajouter ceci: si vous voulez un somme de contrôle , alors s'il vous plaît utiliser un algorithme de contrôle au lieu d'un ( cassé! ) fonction de hachage .

Je ne pense pas que vous n'avez pas besoin d'une fonction de hachage cryptographique sécurisé dans votre fichier indexeur - au contraire, vous avez besoin d'un moyen de voir s'il y a des changements dans les listes de répertoires sans enregistrer la liste entière. algorithmes checksum le font: ils retournent une sortie différente lorsque l'entrée est modifiée. Ils pourraient le faire plus rapidement, car ils sont plus simples que les fonctions de hachage.

Il est vrai qu'un utilisateur pourrait changer un répertoire dans une manière qui ne serait pas découverte par la somme de contrôle. Cependant, un utilisateur devrait changer les noms de fichiers comme celui-ci sur le but puisque les changements normaux dans les noms de fichier (avec une forte probabilité) donner différentes checksum. Est-il alors nécessaire de se prémunir contre cette « attaque »?

Il faut toujours prendre en compte les conséquences de chaque attaque et choisir les outils appropriés.

Je l'ai fait l'un de ces en python si vous êtes intéressé:

http://akiscode.com/articles/sha-1directoryhash.shtml

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top