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 :

Suppression fichier suivant extension


Sujet :

Langage Perl

  1. #21
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Est ce que c'est possible de faire évoluer le perl pour qu'il fasse "copier les fichiers suivant leurs extensions, et les coller suivant leurs arborescence dans le dossier (à définir)"

    j'ai vus que l'on pourrait utiliser File::Copy, mais je ne trouve nulle part la structure pour l'utiliser.... tout comme la structure de File::Find...

    Est ce que l'on pourrait donc modifier le Perl (suivant) pour qui copie les fichiers ???

    Code génial !!! : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl
    use strict; use warnings;
    use File::Find;
    find( \&del_files_by_type, 'C:\Test_batch\test' );
     
    sub del_files_by_type {
      if( not -d $_ 
         and m/\.(?:l.*|page|BCS|dbb?|esav|full|osav|PVTS|r.*|s.*)$/ ){
        unlink( $_ );
      }
    }

    Merci !!!

  2. #22
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par petibonohm
    j'ai vus que l'on pourrait utiliser File::Copy, mais je ne trouve nulle part la structure pour l'utiliser.... tout comme la structure de File::Find...
    Qu'appelle tu la "structure" ? Je t'ai indiqué la documentation de File::Find, dans laquelle on trouve même des exemples, je ne vois donc pas ce que tu veux dire quand tu affirmes que tu ne trouves la structure nulle part ??
    Quant à File::Copy, tu peux trouver la documentation sur cette page.

    Par ailleurs à partir du moment où un module est installé sur ton système, tu peux visualiser sa doc avec la commande "perldoc Nom:u::Module".

    --
    Jedaï

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    le lien ne marche plus pour la page File::copy

    pour perldoc [nom de la commande] comment est ce que l'on met en place ?
    j'arrive pas à lancer cette commande pour avoir une explication sur file::copy...

    je crée un fichier perl copy.pl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #! /usr/bin/perl
     
    use strict; use warning;
     
    use File::Copy;
     
    perldoc File::copy;
    je lance ensuite le perl dans un terminal...

    et là, une liste de caractère incompréhensible (ERREUR...)

    avez vous une idée?

    merci

  4. #24
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 584
    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 584
    Points : 2 031
    Points
    2 031
    Par défaut
    Logiquement, c'est en mode console que ça se passe

    Attention aux majuscules, Perl est sensible à la casse

  5. #25
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    là je passe encore pour un con...

    c'était bien un problème de majuscule, j'avais testé dans le terminal mais sans succès...

    merci!

  6. #26
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Est ce que ceci copirait comme je le veux?

    copie de tout ce qui se trouve dans "dossier1", suivant les extensions et dans les dossiers enfants, vers le "dossier2"


    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
    #!/usr/bin/perl
    use strict; use warnings;
    use File::Copy;
     
    find( \&copy_files_by_type, 'C:\Test_batch\dossier1' );
     
    sub copy_files_by_type {
     
      if( not -d $_ 
     
         and m/\.(?:JPG|an.*)$/ ){
     
        cp $_ C:\Test_batch\dossier2;
     
      }
    }

  7. #27
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je ne comprend pas comment partant de cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            use File::Copy;
     
            copy("file1","file2") or die "Copy failed: $!";
    Tu peux arriver à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cp $_ C:\Test_batch\dossier2;
    ??

    Tu n'as pas mis la virgule et tu n'as pas mis la destination entre guillemets... En plus tu utilises cp() sans l'importer.

    --
    Jedaï

  8. #28
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Désolé Jedaï mais je fais avec les moyens de bord... je suis un débutant en perl, et j'essaye de faire avec ce que je trouve sur le net...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use File::Copy;
     
    copy("file1","file2") or die "Copy failed: $!";
    file est un fichier ou un dossier, comment les distinguer ?

    sinon j'ai plaché sur une autre façon de réaliser ma manip...
    je copie tout et je supprime ce que je ne veux pas...

    CE CODE EST FAUX, il supprime ce que je veux garder, comment lui dire, supprime tout sauf ç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
    #!/usr/bin/perl
     
    use strict; use warnings;use File::Find;
     
    cp --parent $(find C:\Test_batch\test\dossier1 -name) C:\Test_batch\test\dossier1
     
    find( \&del_files_by_type, 'C:\Test_batch\test' );
     
    sub del_files_by_type {
     
      if( not -d $_ 
         and m/\.(?:l.*|page|BCS|dbb|esav|full|osav|PVTS|r.*|s.*)$/ ){
        unlink( $_ );
     
         }
    }

  9. #29
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par petibonohm
    Désolé Jedaï mais je fais avec les moyens de bord... je suis un débutant en perl, et j'essaye de faire avec ce que je trouve sur le net...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use File::Copy;
     
    copy("file1","file2") or die "Copy failed: $!";
    file est un fichier ou un dossier, comment les distinguer ?
    Il fallait le dire si tu avais des problèmes d'anglais...
    file signifie fichier.

    The copy function takes two parameters: a file to copy from and a file to copy to. Either argument may be a string, a FileHandle reference or a FileHandle glob. Obviously, if the first argument is a filehandle of some sort, it will be read from, and if it is a file name it will be opened for reading. Likewise, the second argument will be written to (and created if need be). Trying to copy a file on top of itself is a fatal error.
    Traduction :

    La fonction copy() prend deux paramètres : un fichier à partir duquel copier et un fichier vers lequel copier. Chaque paramètre peut être soit une chaîne de caractère, soit une référence vers un handle de fichier ou un GLOB handle de fichier. Evidemment, si le premier paramètre est un handle de fichier quel que soit son type, on lira à partir de lui, et si c'est un nom de fichier, il sera ouvert pour être lu. De même, on écrira dans le second paramètre (qui sera créé si besoin est). Essayer de copier un fichier vers lui-même est une erreur critique.

    Autrement dit, tu aurais dû écrire ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl
    use strict; use warnings;
    use File::Copy;
     
    find( \&copy_files_by_type, 'C:\Test_batch\dossier1' );
     
    sub copy_files_by_type {
      if( -f $_ and m/\.(?:JPG|an.*)$/ ) {
        copy($_, "C:/Test_batch/dossier2/$_")
          or warn "$_ n'a pas été copié : $!\n";
      }
    }
    --
    Jedaï

  10. #30
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Merci Jedaï

    il est vrai que mon anglais n'est pas super...

    merci pour le script, j'apprécis beaucoup cet esprit d'entraide sur ce forum...


  11. #31
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    j'exécute le perl et j'ai un problème

    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
    #!/usr/bin/perl
     
    use strict; use warnings;
    use File::Copy;
     
    find( \&copy_files_by_type, 'home/USER/Desktop/TEST/dossier1' );
     
     sub copy_files_by_type {
     
      if( -f $_ and m/\.(?:JPG|an.*)$/ ) {
        copy($_, "home/USER/Desktop/TEST/dossier2/$_")
          or warn "$_ n'a pas été copié : $!\n";
     
      }
    }
    voiçi l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Undefined subroutine &main::find called at copy.pl line 9.

  12. #32
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 584
    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 584
    Points : 2 031
    Points
    2 031
    Par défaut
    Où se trouve ta fonction find( ) dans ton script ?

  13. #33
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    à la ligne 6 non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find( \&copy_files_by_type, 'home/USER/Desktop/TEST/dossier1' );

  14. #34
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 584
    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 584
    Points : 2 031
    Points
    2 031
    Par défaut
    Heu non, ça c'est une utilisation de la fonction find( ), pas la fonction en elle-même.

    Si tu as du mal avec l'anglais, voici en substance ce que dit le message d'erreur que tu as eu :

    Undefined subroutine &main::find called at copy.pl line 9.
    Fonction &main::find non définie appelée à la ligne 9 de copy.pl.

  15. #35
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    J'ai recopié ton code sans faire attention... Mais tu as oublié d'importer File::Find ! Normal qu'il ne trouve pas le find().

    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
    #!/usr/bin/perl
     
    use strict; use warnings;
    use File::Copy;
    use File::Find;
     
    find( \&copy_files_by_type, 'home/USER/Desktop/TEST/dossier1' );
     
     sub copy_files_by_type {
     
      if( -f $_ and m/\.(?:JPG|an.*)$/ ) {
        copy($_, "home/USER/Desktop/TEST/dossier2/$_")
          or warn "$_ n'a pas été copié : $!\n";
     
      }
    }
    --
    Jedaï

  16. #36
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    le perl copie ne marche pas complêtement...

    au départ :

    DOSSIER 1
    ->dossierA
    ---->fichier.jpg
    ---->fichier.ant
    ---->fichier.bot
    ->dossierB
    ---->fichier.jpg
    ---->fichier.ant
    ---->fichier.bot
    ->fichier.jpg
    ->fichier.ant
    ->fichier.bot

    après la copie :

    DOSSIER 2
    ->fichier.jpg
    ->fichier.ant

    en fait, je voudrais :

    DOSSIER 2
    ->dossierA
    ---->fichier.jpg
    ---->fichier.ant
    ->dossierB
    ---->fichier.jpg
    ---->fichier.ant
    ->fichier.jpg
    ->fichier.ant

  17. #37
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu veux préserver la structure des sous-répertoires ?
    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
    #!/usr/bin/perl
     
    use strict; use warnings;
    use File::Copy;
    use File::Find;
     
    my $from = 'home/USER/Desktop/TEST/dossier1';
    my $to = 'home/USER/Desktop/TEST/dossier2';
     
    find( \&copy_files_by_type, $from);
     
     sub copy_files_by_type {
     
      if( -f $_ and m/\.(?:JPG|an.*)$/ ) {
        # on récupère le chemin complet du fichier
        # et on y remplace le répertoire d'origine par celui de 
        # destination
        (my $dest = $File::Find::name) =~ s/\Q$from\E/$to/;
        copy($_, $dest)
          or warn "$_ n'a pas été copié : $!\n";
     
      }
    }
    devrait faire l'affaire.

    --
    Jedaï

  18. #38
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    j'ai un message d'erreur...

    fichier.an n'a pas t copi : Aucun fichier ou répertoire de ce type
    fichier.an n'a pas t copi : Aucun fichier ou répertoire de ce type
    fichier.an n'a pas t copi : Aucun fichier ou répertoire de ce type
    fichier.an n'a pas t copi : Aucun fichier ou répertoire de ce type
    j'ai le même résusltat qu'avant, ça copie que les fichiers (suivant l'extension) et pas les sousdossier et ce qu'ils contiennent...

  19. #39
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ok, il y avait quelques problèmes :
    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
    #!/usr/bin/perl
    use strict; use warnings;
    use File::Copy; use File::Find;
    use File::Spec;
     
    my $from = File::Spec->rel2abs( shift );
    my $to = File::Spec->rel2abs( shift );
    my $rx = shift;
    $rx = qr/$rx/;
     
    find( \&copy_files_by_type, $from);
     
    sub copy_files_by_type {
        if( -f $_ and m/$rx/ ) {
            # on récupère le chemin complet du fichier
            # et on y remplace le répertoire d'origine par celui de
            # destination
            (my $dest_dir = $File::Find::dir) =~ s/\Q$from\E/$to/;
     
            if( not -e $dest_dir ) {
                mkdir $dest_dir
                    or die "Couldn't create $dest_dir as a directory : $!\n";
            }
     
            copy($_, "$dest_dir/$_")
                or warn "$_ n'a pas été copié : $!\n";
        }
    }
     
    __END__
    --
    Jedaï

  20. #40
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Et on ne doit pas mettre un adressage por spécifier ou l'on veux que ça travaille...?

    voiçi l'erreur obtenue :

    Use of ininitialized value in regexp compilation at copy.pl line 9
    'copy.pl' and '/home/USER/Desktop/copy.pl' are identical (not copied) at copy.pl line 25

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Récupérer un nom de fichier sans extension
    Par OxN dans le forum Général Java
    Réponses: 13
    Dernier message: 01/08/2011, 16h13
  2. Copier Coller tous fichiers suivant extension
    Par arno21600 dans le forum Général Java
    Réponses: 9
    Dernier message: 04/01/2011, 13h04
  3. Ouverture d'un fichier suivant début d'extension
    Par cchampion2fr dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/10/2008, 13h32
  4. Réponses: 3
    Dernier message: 31/03/2008, 13h59
  5. Lire fichier suivant son extension !!
    Par Shandler dans le forum Langage
    Réponses: 37
    Dernier message: 18/11/2005, 14h44

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