IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

script de synchronisation entre deux dossier (perl)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut script de synchronisation entre deux dossier (perl)
    Bonjour,

    Je cherche à faire un script en PERL qui me permettrait de synchroniser deux dossiers

    un dossier source avec un dossier destination. J'ai réalisé jusque la une partie de mon code mais plein d'erreur se sont fait la joie de venir, évidemment sinon se n'est pas drôle.

    Le code doit impérativement être en PERL (travail de classe, et oui)

    je vous présente donc ce que j'ai déjà mis au point.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #! /usr/bin/perl -w
    use strict; 
    use warnings;
    use File::Compare;
     
    my($source,$dest) = ($ARGV[0],$ARGV[1]);
     
    	#met mon dossier source dans la variable $dossiersrc et ensuite entre les element du dossier dans le tableau tblsrc	
    	my ($dossiersrc) = "$source";
    	my @tblsrc = $dossiersrc;
     
    	#met mon dossier sdestination dans la variable $dossierdest et ensuite entre les element du dossier dans le tableau tbldest
    	my ($dossierdest) = "$dest";
    	my @tbldest = $dossierdest;
     
    	#cette boucle for permet de parcourir le tableau source
    	for(my ($j) = 0; $j < @tblsrc; $j++)
    	{
    		# ici je vérifie si l'élément séléctionné est un dossier
    		if(-d $dossiersrc == true)
    		{
    			#je crée un Flag afin de tester si l'élément séléctionner possède un double dans le dossier de destination
    			my $Flag = 0;
    			# cette boucle me permet de parcourir le dossier de destination
    			for (my ($i) = 0; $i < @tbldest; $i++)
    			{
    				# Cette boucle if compare les deux éléments séléctionné				
    				if($tblsrc[j] == $tbldest[i])
    				{
    					# comme l'élément du dossier source est un dossier et que l'élément du dossier destination l'est également, je lance relance la synchronisation de façon récursive en entrant cette fois les dossier séléctionné dans les tableaux comme nouveaux dossiers source et destination, pour montrer que l'élément du dossier source possèdait un doublon, je met le flag à un.					
    					synchronisation($tblsrc[j],$tbldest[i]);			
    					$Flag = 1;
    				}
    			}
    			# je test le flag, pour voir si l'élément séléctionné precèdemment a trouver un doublon
    			if($Flag == 0)
    			{
    				# comme le flag est à zéro, cela veut dire que mon élément séléctionné ne possède pas de doublon il doit donc être copier dans le dossier de recetpion				
    				dircopy($tblsrc[j],$dossierdest);
    			}
    		}
    		# le esle veut dire que l'élément séléctionné n'est pas un dossier donc il s'agit d'un fichier
    		else
    		{
    			#comme avant je déclare un flag à zéro pour vérifier si l'élément séléctionné possède un doublon
    			my $Flag = 0;
    			# cette boucle parcour le tableau destination
    			for(my ($i) = 0; $i < @tbldest; $i++)
    			{
    				# ce if compare si les deux éléments séléctionné sont des doublon l'un de l'autre
    				if($tblsrc[j] == $tbldest[i])
    				{
    					#si oui je met le flag à un et je test voire si les dates de dérnière modification sont pareille 
    					$Flag =1;
    					if(compare($tblsrc[j], $tbldest[i]) != 0)
    					{
    						# si elles sont diffèrente, je copie l'élément séléctionné du dossier source dans le dossier de destination
    						copy($tblsrc[j], $dossierdest);
    					}
    				}				
    			}
    			# je test pour voire si l'élément sélectionné possèdait un doublon	
    			if($Flag == 0)
    			{
    				# comme le flag est à zéro, cela veut dire que mon élément séléctionné ne possède pas de doublon il doit donc être copier dans le dossier de destination				
    				copy($tblsrc[j],$dossierdest);
    			}
    		}
    	}
    	print "@tblsrc \n";
    	print "@tbldest \n";

    et voici le resultat :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    john@john-VirtualBox:~$ /home/john/Bureau/synchronisation.pl /home/john/Bureau/dossiersrc /home/john/Bureau/dossierrcpt
    Argument "j" isn't numeric in array element at /home/john/Bureau/synchronisation.pl line 28.
    Argument "i" isn't numeric in array element at /home/john/Bureau/synchronisation.pl line 28.
    Argument "j" isn't numeric in array element at /home/john/Bureau/synchronisation.pl line 51.
    Argument "i" isn't numeric in array element at /home/john/Bureau/synchronisation.pl line 51.
    Bareword "true" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 20.
    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 28.
    Bareword "i" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 28.
    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 31.
    Bareword "i" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 31.
    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 39.
    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 51.
    Bareword "i" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 51.
    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 55.
    Bareword "i" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 55.
    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 58.
    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 66.
    Execution of /home/john/Bureau/synchronisation.pl aborted due to compilation errors.

    j'ai commencer le PERL il y a 3 mois, pour vous faire une idée de mes connaissance et le cour est le lundi matin ^^.

    En espérant avoir une où deux réponses, je vous souhaite un agréable soirée.

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    les messages d'erreur sont bien utiles, relis-les bien

    sans te faire tout le boulot, voilà quelques erreurs à corriger:
    les parenthèses ici ne servent à rien, sauf si tu initialises des éléments venant d'une liste, du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my ($i, $titi) = (0,"toto");
    ou
    my $i = 0;
    my $titi = "toto";
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(-d $dossiersrc == true)
    -d renvoie déjà true or false, pas besoin de le retester derrière

    la dernière erreur indique une erreur de syntaxe, il te manque quelque chose, mais quoi

  3. #3
    Membre émérite Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Par défaut
    Bonjour,

    tu as une majorité de :

    Bareword "j" not allowed while "strict subs" in use at /home/john/Bureau/synchronisation.pl line 55.
    cela est dû a une erreur de syntaxe basique lors de l'emploi de tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (my ($i) = 0; $i < @tbldest; $i++)
    			{
    				# Cette boucle if compare les deux éléments séléctionné				
    				if($tblsrc[j] == $tbldest[i])
    ou tu utilises tes compteurs comme ceci $tblsrc[j] au lieu de $tblsrc[$j], tout simplement .

    Avec les conseils précédent et sans erreur de ce type (inattention je pense) ça devrait aller bien mieux !

    J'ajouterai enfin qu'une boucle "foreach" serait bien plus simple et appropriée au parcours de tes tableaux mais ça , c'est toi qui vois .

    Bonne journée !

  4. #4
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut
    Bonjour,

    pour commencer, je vous remercie pour les réponses que vous m'avez apporté.

    En effet les erreurs de [i] au lieu de [$i] était de l’inattention, surement des reste de C/C++ ^^'.

    Merci aussi à Gardyen, pour tes explications ^^.


    Je vais essayé de voire comment fonctionne les foreach en perl et voire pour les utiliser.^^

    je vous tiendrez au courant dans mon avancement, si cela vous intéresse ^^.

    bonne journée.

  5. #5
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut
    Rebonjour,

    voila un moment que j'ai continué à faire mon script. Après plusieurs erreurs et modifications. , voila le résultat actuel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #! /usr/bin/perl -w
    use strict; 
    use warnings;
    use File::Compare;
     
    my($src,$dest,$temps) = ($ARGV[0],$ARGV[1],$ARGV[2]);
     
    &synchronisation();
     
    sub synchronisation
    {
     
    	#met mon dossier source dans la variable $dossiersrc et ensuite entre les element du dossier dans le tableau tblsrc	
    	opendir my ($dossiersrc), $src or die "Erreur : $!\n";
    	my @tblsrc = readdir($dossiersrc);
    	close $dossiersrc;
     
    	#met mon dossier sdestination dans la variable $dossierdest et ensuite entre les element du dossier dans le tableau tbldest
    	opendir my ($dossierdest), $dest or die "Erreur : $!\n";
    	my @tbldest = readdir($dossierdest);
    	close $dossierdest;
     
     
    	#cette boucle foreach permet de parcourir le tableau source
    	foreach my $parcourirsrc (@tblsrc)
    	{
    		# ici je vérifie si l'élément séléctionné est un dossier
    		if(-d $parcourirsrc)
    		{
    			#je crée un Flag afin de tester si l'élément séléctionner possède un double dans le dossier de destination
    			my $Flag = 0;
    			# cette boucle me permet de parcourir le dossier de destination			
    			foreach my $parcourirdest (@tbldest)
    			{
    				# Cette boucle if compare les deux éléments séléctionné				
    				if($parcourirsrc eq $parcourirdest)
    				{
    					# comme l'élément du dossier source est un dossier et que l'élément du dossier destination l'est également, je lance relance la synchronisation de façon récursive en entrant cette fois les dossier séléctionné dans les tableaux comme nouveaux dossiers source et destination, pour montrer que l'élément du dossier source possèdait un doublon, je met le flag à un.
    					print "rec\n";
    					synchronisation($parcourirsrc,$parcourirdest);			
    					$Flag = 1;
    				}
    			}
    			# je test le flag, pour voir si l'élément séléctionné precèdemment a trouver un doublon
    			if($Flag == 0)
    			{
    				# comme le flag est à zéro, cela veut dire que mon élément séléctionné ne possède pas de doublon il doit donc être copier dans le dossier de recetpion			
    				push(@tbldest, $parcourirsrc);	
    				#dircopy($tblsrc[$j],@tbldest);
    			}
    		}
    		# le esle veut dire que l'élément séléctionné n'est pas un dossier donc il s'agit d'un fichier
    		else
    		{
    			#comme avant je déclare un flag à zéro pour vérifier si l'élément séléctionné possède un doublon
    			my $Flag = 0;
    			# cette boucle parcour le tableau destination
    			foreach my $parcourirdest (@tbldest)
    			{
    				# ce if compare si les deux éléments séléctionné sont des doublon l'un de l'autre
    				if($parcourirsrc eq $parcourirdest)
    				{
    					#si oui je met le flag à un et je test voire si les dates de dérnière modification sont pareille 
    					$Flag =1;
    					if(compare($parcourirsrc, $parcourirdest) != 0)
    					{
    						# si elles sont diffèrente, je copie l'élément séléctionné du tableau source dans le tableau de destination
    						$parcourirdest = $parcourirsrc;						
    					}
    				}				
    			}
    			# je test pour voire si l'élément sélectionné possèdait un doublon	
    			if($Flag == 0)
    			{
    				# comme le flag est à zéro, cela veut dire que mon élément séléctionné ne possède pas de doublon il doit donc être copier dans le dossier de destination				
    				#$#tbldest = $parcourirsrc;
    				push(@tbldest, $parcourirsrc);
    			}
    		}
    	}
    	print "@tblsrc \n";
    	print "@tbldest \n";
     
    	$dossiersrc = @tblsrc;
    	$dossierdest = @tbldest;
    }
    maintenant un autre erreur fait son apparition, comme vous pouvez le voir à la ligne 39 je print le mot "rec" pour tester ma fonction récursive. Le problème est que ma fonction est à l'infini. Donc dans le cas suivant mon script plant.

    Avez-vous une idée à me conseiller pour arranger ça? ^^

    Encore une autre question. A la fin de mon script je suis senser mettre a jour les dossier alors que j'ai l'impression que mon script ne travaille qu'avec les valeur mise dans les tableaux tblsrc et tbldest et ne copie/remplace pas les éléments dans mon dossier dest.
    Auriez-vous aussi un idée sur comment faire?


    Tous en faisant des recherche de mon coter et en attandant une réponse aidante, je vous souhaite une agréable journée.

  6. #6
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    pour autant que je puisse voir, tu n'utilises pas les paramètres que tu passes à ta fonction, donc ta fonction ne fait que lire le premier dossier, encore et encore

Discussions similaires

  1. alfresco script entre deux dossiers
    Par wajdinho123 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 08/03/2013, 10h31
  2. Synchronisation entre deux fichiers
    Par Chronax dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 11/10/2007, 00h52
  3. [2005] Synchronisation entre deux bases
    Par mister3957 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/08/2007, 12h46
  4. Réponses: 2
    Dernier message: 08/04/2007, 22h49
  5. synchronisation entre deux threads
    Par chabfive dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 03/11/2006, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo