#!/usr/bin/perl -W # TP synchronisation de fichiers en perl # # Question 2 # version sans références (passage par variable globales) # # Antoine Miné # 26/01/2007 $dirB = $ARGV[0]; $dirA = $ARGV[1] or die "utilisation: $0 repertoire-courant repertoire-archive"; # parcours($dir) parcours récursivement le répertoire $root/$dir. # Pour chaque fichier f normal de $root/$dir, son hash h est calculé, et # le couple ($dir/f,h) est ajouté à %table. # %table et $root sont globaux. # $root vaudra soit $dirA, soit $dirB. sub parcours { my $dir = shift; opendir(DIR,"$root/$dir") or return; my @files = readdir(DIR) or return; closedir(DIR); foreach (@files) { next if /^\.\.?$/; $filename = "$dir/$_"; # chemin depuis root $fullfilename = "$root/$filename"; # chemin complet if (-d $fullfilename) { parcours($filename); } elsif (-f $fullfilename) { # lance la commande sha1sum et récupère son résultat # ATTENTION aux " ": indispensables si $fullfilename contient # des espaces! $result = `sha1sum "$fullfilename"`; # mange la fin de la ligne (nom de fichier) pour ne garder que # la signature chomp $result; $result =~ s/ .*$//; # stocke le résultat $table{$filename} = $result; } } } # calcule la table de A $root = $dirA; %table = (); parcours("."); %tableA = %table; # calcule la table de B $root = $dirB; %table = (); parcours("."); %tableB = %table; # cherche les fichier de B à copier dans A # il s'agit des fichiers de B non présent dans A, ou de sha différent for (keys %tableB) { next if defined($tableA{$_}) && $tableA{$_} eq $tableB{$_}; print "copie $dirB/$_ => $dirA/$_\n"; } # cherche les fichiers de A à effacer # il s'agit des fichiers de A non présent dans B for (keys %tableA) { next if defined($tableB{$_}); print "détruit $dirA/$_\n"; }