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 :

Problèmes pour copier des fichiers dans un autre répertoire


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut Problèmes pour copier des fichiers dans un autre répertoire
    Bonjour tout le monde,

    J'ai un problème avec un script que je viens d'écrire. Je souhaiterais copier des images dans un repertoire à l'exception de certains fichiers que j'exclus à l'aide d'une expression rationnelle. Voici le script :

    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
    #! /bin/perl
     
    use warnings;
     
    my @test = "ls -l /var/www/pdf/image | awk '{print \$8}'";
     
    $resultat = system(@test);
     
    foreach my $ligne (@resultat)
    {
    	if ((!($ligne =~ /label/i)) && (!($ligne =~ /processes/i)) && (!($ligne =~ /logged/i)))
    	{
    		system("cp /var/www/pdf/image/".$ligne." /var/www/pdf/imageFiltree/".$ligne);
    	}
     
    }
    Je ne comprends pas pourquoi la commande "cp" n'est pas éxécutée... De plus quand j'éxécute le script, il m'affiche les noms des fichiers alors que je ne lui précise pas de le faire.

    Merci de votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Bonjour,

    il existe le module File::Copy qui est très bien pour copier/déplacer des fichiers.

    Tu devrais l'essayer plutôt que de passer par ton appel system

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    J'ai rajouté des lignes en utilisant ce module, en vain :

    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
    #! /bin/perl
     
    use warnings;
    use File::Copy
     
     
    $resultat = system("ls -l /var/www/pdf/image | awk '{print \$8}'");
     
    chdir ("/var/www/pdf/image");
     
    foreach my $ligne (@resultat)
    {
    	$newFile = "/var/www/imageFiltree/".$ligne;
     
    	if (($ligne ne "Label") && ($ligne ne "Processes") && ($ligne ne Logged))
    	{
    		copy($ligne, $newFile) or warn $!;
    		system("cp /var/www/pdf/image/t /var/www/pdf/imageFiltree/toto");
    	}
     
    }

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Ton code ne doit même plus compiler : il manque le ; après "use File::Copy"

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    De plus, cette ligne là est erronée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (($ligne ne "Label") && ($ligne ne "Processes") && ($ligne ne Logged))
    Il manque les " " à Logged.

    Ton script Perl ne doit vraiment pas compiler du tout

    Essaie de le tester pour voir s'il compile en tapant la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -c -w tonscript.pl

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Oui j'ai vu ça, mais le problème est autre :\.

    C'est vraiment bizarre. J'ai essayé ça :

    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
    #! /bin/perl
     
    use warnings;
    use File::Copy
     
     
    $repertoire = '/var/www/pdf/image';
     
    opendir (my $dir, $repertoire) or die $!;
    my @fichiers = readdir $dir;
     
    foreach my $ligne (@fichiers)
    {
    	$newFile = "/var/www/imageFiltree/".$ligne;
    	$oldFile = "image/".$ligne;
     
    	if ((!($ligne =~ /Label/i)) && (!($ligne =~ /Processes/i)) && (!($ligne =~ /Logged/i)))
    	{
    		#copy($oldFile, $newFile) or warn $!;
    		system("cp /var/www/pdf/image/".$ligne" /var/www/pdf/imageFiltree/".$ligne);
    	}
     
    }
     
    closedir $dir;
    Voici l'erreur que j'obtiens :

    "/var/www/pdf/image" is not exported by the File::Copy module
    Can't continue after import errors at filtre.pl line 6
    BEGIN failed--compilation aborted at filtre.pl line 6.
    Edit : Bon le problème venait du fait que j'avais oublié ";" à la ligne "use File::Copy"

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    problème résolu alors ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Affirmatif, j'édite le titre !

    Merci pour ton aide.

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    de rien

  10. #10
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    J'aurais une petite remarque sur ton if cependant (rien à voir avec ton problème, juste pour info) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((!($ligne =~ /Label/i)) && (!($ligne =~ /Processes/i)) && (!($ligne =~ /Logged/i)))
    C'est trop compliqué, et difficile à lire avec toutes ces parenthèses. Une première simplification possible serait de retirer tous ces opérateurs ! et remplacer tous les =~ par des !~, ça revient au même et cela rend totalement superflues trois paires de parenthèses (ne gardant que celles qui délimitent les expressions - pas nécessaires, mais c'est une question de goût).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (($ligne !~ /Label/i) && ($ligne !~ /Processes/i) && ($ligne !~ /Logged/i))
    Une approche différente consisterait à factoriser le ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!(($ligne =~ /Label/i) || ($ligne =~ /Processes/i) || ($ligne =~ /Logged/i)))
    À noter que dans ce cas, on pourrait virer le ! en remplaçant le if par un unless.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unless (($ligne =~ /Label/i) || ($ligne =~ /Processes/i) || ($ligne =~ /Logged/i))
    Vu qu'il n'y a pas de else, pas de problème de lisibilité, à moins de détester unless (ce qui est le cas de certains).

    Mais voyons ce que nous avons maintenant : trois comparaisons d'une même variable avec trois expressions régulières simples, le tout relié par des ||. Pourquoi ne pas tout fusionner en une seule regex ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unless ($ligne =~ /Label|Processes|Logged/i)
    Ou, si on n'aime pas unless :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($ligne !~ /Label|Processes|Logged/i)
    Voilà, c'est quand même un peu plus digeste, non ? En plus, je crois que c'est plus performant (oh, pas grand'chose, surtout pour ce type d'application).

    Dernière remarque : ce serait quand même bien de passer au pragma strict. Voir par là pour des explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2011, 17h15
  2. Réponses: 0
    Dernier message: 08/01/2011, 14h49
  3. Problème pour lister des fichiers dans une interface
    Par sapristy dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 23/02/2010, 14h00
  4. Réponses: 3
    Dernier message: 30/11/2006, 11h38
  5. Réponses: 3
    Dernier message: 12/04/2006, 20h44

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