1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
| use Getopt::Long;
use Digest::MD5;
#Variable nécessaire pour l'utilisation des options
my $size = '';
my $date = '';
my $md5 = '';
#Table contenant les tests déjà effectués lors de la première comparaison
@table = ();
GetOptions (
"size" => \$size,
"date" => \$date,
"md5" => \$md5
);
#Le nom des répertoire à comparer passe en argument
my $dir="$ARGV[0]";
my $dir1="$ARGV[1]";
#On s'assure que le nom du répertoire ne se termine pas par un "/"
$dir=~ s/[\/]$//;
$dir1=~ s/[\/]$//;
#On attribue le nom de fichier de sortie pour le test du script
my $test="rapport";
#On ouvre le fichier de sortie en mode écriture
if (!open (FILEOUT,">$test")) { die "Impossible d'ouvrir le fichier $output1"};
#on lance les parcours récursifs pour comparer les deux fichiers
&parcourir_arbo_directory($dir,$dir1); #recurse!
&parcourir_arbo_directory($dir1,$dir); #recurse!
#On ferme le Fileout
close(FILEOUT);
exit;
#Procédure
sub parcourir_arbo_directory {
#On récupère les deux arguments.
my $path = shift(@_);
my $path2 = shift(@_);
#Ouverture des répertoires
opendir(DIR, $path) or die "can't open $path: $!\n";
opendir(DIR2, $path2) or die "can't open $path2: $!\n";
#On "récupère" le contenu des répertoires dans des tableaux
my @files = readdir(DIR);
my @files2 = readdir(DIR2);
#Pour chacun des « éléments » contenus dans le répertoire,
#on va vérifier son statut (répertoire -d ou fichier -f)
#et le comparer au deuxieme répertoire
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
my $boolean = 0;
my $diff_md5= 0;
my $diff_taille= 0;
my $diff_date= 0;
#On écrit le chemin complet de l « élément »
my $new_file = $path."/".$file;
#Si l « élément » est un répertoire (-d = directory) : on relance le parcours dans le cas où le répertoire existe des deux côtés
if (-d $new_file) {
foreach my $file2 (@files2) {
next if $file2 =~ /^\.\.?$/;
my $new_file2 = $path2."/".$file2;
if ($file eq $file2 && -d $new_file2) {
&parcourir_arbo_directory($new_file, $new_file2); #recurse!
$boolean = 1;
}
}
}
#Si l « élément » est un fichier (-f = file) : on compare avec les éléments du deuxième répertoire
if (-f $new_file) {
foreach my $file2 (@files2) {
last if($boolean ==1);
next if $file2 =~ /^\.\.?$/;
#On écrit le chemin complet de l « élément »
$new_file2 = $path2."/".$file2;
next if (-d $new_file2);
#Comparaison simple, on vérifie juste le nom des fichiers
if ($file eq $file2 && -f $new_file2) {
$boolean = 1;
}
#Comparaison avec option sur la taille, on vérifie que la taille est identique si ce n'est pas le cas le boolean repasse à 0
if ($size && -s $new_file ne -s $new_file2 && $boolean == 1) {
$boolean = 0;
$diff_taille = 1;
foreach my $i (@liste) {
if ($i eq $new_file) {
$boolean = 1;
}
}
push (@liste, $new_file2);
}
#Même chose avec la date
if ($date && -M $new_file ne -M $new_file2 && $boolean == 1) {
$boolean = 0;
$diff_date = 1;
foreach my $i (@liste) {
if ($i eq $new_file) {
$boolean = 1;
}
}
push (@liste, $new_file2);
}
if ($md5 && $boolean == 1) {
open(FILE1, $new_file) or die "can't open $path: $!\n";
open(FILE2, $new_file2) or die "can't open $path: $!\n";
binmode(FILE1);
binmode(FILE2);
my $md5_check1 = Digest::MD5->new;
my $md5_check2 = Digest::MD5->new;
$md5_check1->addfile(*FILE1);
$md5_check2->addfile(*FILE2);
my $digest1 = $md5_check1->b64digest;
my $digest2 = $md5_check2->b64digest;
close(FILE1);
close(FILE2);
if ($digest1 ne $digest2) {
$boolean = 0;
$diff_md5= 1;
foreach my $i (@liste) {
if ($i eq $new_file) {
$boolean = 1;
}
}
push (@liste, $new_file2);
}
}
}
}
if ($boolean == 0 && $diff_md5 == 0 && $diff_taille == 0 && $diff_date ==0) {
print FILEOUT "$new_file fichier non existant dans $path2 \n";
}
if ($boolean == 0 && $diff_md5 == 1) {
print FILEOUT "$new_file et $path2/$file ont un MD5 différent \n";
}
if ($boolean == 0 && $diff_taille == 1) {
print FILEOUT "$new_file et $path2/$file ne font pas la même taille \n";
}
if ($boolean == 0 && $diff_date == 1) {
print FILEOUT "$new_file et $path2/$file n'ont pas la même date \n";
}
}
closedir(DIR);
closedir(DIR1);
} |
Partager