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 :

Besoin d'aide sur un script


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Besoin d'aide sur un script
    Bonjour, j'ai un script que j'avais récupéré qui me permettait de placer les fichiers d'un répertoire dans plusieurs sous-repertoires portant comme nom la date de création du fichier (2024.01.02 par exemple)
    Depuis quelques temps il ne fonctionne plus ou plutôt il fonctionne mal : tous mes fichiers sont placés dans un répertoire ayant pour nom la date du jour.
    Quelqu'un peut-il m'aider ?

    Merci

    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
        #!/usr/bin/perl
        use strict;
        use warnings;
        use autodie;
     
        use File::Basename;
        use File::Find;
        use File::stat;
     
        $::PROGRAM = basename $0;
     
        sub creation_date {
          my $i = 0;
          my @cdate = map {$_ + (0, 1, 1900)[$i++]} (localtime(stat(shift)->ctime))[3..5];
          return sprintf("%04d.%02d.%02d", reverse @cdate);
        }
     
        sub process {
          if (-f) {
            my $file = $_;
            # on ne traite pas un fichier de même nom que le script
            return if (/^$::PROGRAM$/);
            # on récupère la date de création au format adéquat
            my $cdate = creation_date($file);
            # on ne fait rien si le fichier est déjà dans le bon répertoire
            return if (basename($File::Find::dir) eq $cdate);
            # Arrêt si le répertoire ne peut être créé à cause d'un fichier de même nom
            die "Erreur: le nom '$cdate' est déjà utilisé par un fichier!" if (-f $cdate);
            # On crée le répertoire s'il n'existe pas
            mkdir $cdate unless (-d $cdate);
            # Arrêt si le fichier existe déjà dans le répertoire
            die "Erreur: collision: '$file' existe déjà dans le dossier $cdate!" if (-f $cdate.'/'.$file);
            # on effectue le déplacement du fichier dans le répertoire
            rename $file, $cdate.'/'.$file;
          }
        }
     
        find({ bydepth => 1, wanted => \&process, follow => 1 }, '.');

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 938
    Points : 7 347
    Points
    7 347
    Par défaut
    Bonjour,

    Le fonctionnement d'un script ne change pas du jour au lendemain.

    Relisez votre code et ce que vous avez modifié pour en arriver là...

    Je ne connais pas PERL, mais si c'est une histoire de fichier et date de création/modification, c'est sans doute une histoire de fonction stat avec ctime qui ne correspond pas à ce que vous souhaitez.

    Qui puis est cette phrase n'est pas clair ?

    placer les fichiers d'un répertoire dans plusieurs sous-repertoires portant comme nom la date de création du fichier
    Quel était le comportement attendu du script avant qu'il ne commence à mal fonctionner ?
    Quel est le comportement exact que vous observez maintenant ?
    Pouvez-vous fournir des exemples de la façon dont les dates de fichiers sont traitées incorrectement ?

    Cela aiderait à comprendre la nature exacte du problème.

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    C'est justement ce que je ne comprend pas, je ne connais pas le perl, ce n'ai pas moi qui ait fait ce script, je ne l'ai pas pu le modifier...

    Avant de basculer sous windows 11, lorsque j'executais le script, cela me créait autant de repertoires que de dates de créations des fichiers contenus dans le repertoire source et me plaçait chaque fichier dans le répertoire adéquat.
    Maintenant, un seul dossier est crée, ayant pour nom la date du jour et tous les fichiers sont placés dedans.

    Merci

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 938
    Points : 7 347
    Points
    7 347
    Par défaut
    Étant donné que je n'ai pas tout compris, j'ai créé un script perl,

    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
    use strict;
    use warnings;
    use Getopt::Long;
    use File::Copy;
    use File::Path qw(make_path);
    use POSIX qw(strftime);
     
     
    # Lire le paramètre --directory
    my $directory;
    GetOptions("directory=s" => \$directory) or die "Usage: $0 --directory NAME\n";
    die "You must specify a directory with --directory" unless $directory;
     
     
    # Lire le contenu du répertoire
    opendir(my $dh, $directory) or die "Cannot open directory: $!";
    my @files = grep { !/^\.+$/ } readdir($dh);
    closedir($dh);
     
     
    foreach my $file (@files) {
        my $path = "$directory/$file";
     
     
        # Ignorer les dossiers
        next if -d $path;
     
     
        # Obtenir la date de création du fichier
        my $creation_time = (stat($path))[9];
        my $date = strftime "%Y-%m-%d", localtime($creation_time);
     
     
        # Créer un dossier pour cette date s'il n'existe pas déjà
        my $date_directory = "$directory/$date";
        if (!-e $date_directory) {
            make_path($date_directory) or die "Cannot create directory $date_directory: $!";
        }
     
     
        # Copier le fichier dans le dossier de sa date de création
        copy($path, "$date_directory/$file") or die "Copy failed: $!";
    }
    Pour exécuter ce script

    perl script.pl --directory /home/xxx/my_directory

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    j'ai testé sous windows 10.

    Ma méthode :
    création d'un dossier de test
    copie de fichiers divers et variés manuellement dans ce dossier
    lancement du script


    Le problème que j'ai observé, c'est que lors de ma copie des fichiers dans le répertoire de test, windows change la date de création par la date actuelle.
    C'est selon moi ce qui explique le fait que tu n'ai plus qu'un seul dossier.

    Une solution serait de modifier le script en changeant la ligne 14
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @cdate = map {$_ + (0, 1, 1900)[$i++]} (localtime(stat(shift)->ctime))[3..5];
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     my @cdate = map {$_ + (0, 1, 1900)[$i++]} (localtime(stat(shift)->mtime))[3..5];
    En fait, on vient maintenant chercher la dernière date de modification.
    J'ai testé et les fichiers sont dans les bons répertoires.
    A voir si c'est un critère suffisant.

  6. #6
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci, je viens de tester et ça me met tout dans un dossier nommé 2024.01.02 (la date d'hier). Là je ne comprend pas. Pourtant mes fichiers ont des dates de création différentes, même après execution du script, ces dates de création sont inchangées...

    Nom : dates.jpg
Affichages : 163
Taille : 119,4 Ko

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 938
    Points : 7 347
    Points
    7 347
    Par défaut
    Bonjour,

    Qu'avez-vous testé ? Si c'est mon code ça me surprendrait, chez moi ça fonctionne plutôt bien...

  8. #8
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    Qu'avez-vous testé ? Si c'est mon code ça me surprendrait, chez moi ça fonctionne plutôt bien...
    Bonjour, voici le script que j'exécute :

    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
        #!/usr/bin/perl
        use strict;
        use warnings;
        use autodie;
     
        use File::Basename;
        use File::Find;
        use File::stat;
     
        $::PROGRAM = basename $0;
     
        sub creation_date {
          my $i = 0;
           my @cdate = map {$_ + (0, 1, 1900)[$i++]} (localtime(stat(shift)->mtime))[3..5];
          return sprintf("%04d.%02d.%02d", reverse @cdate);
        }
     
        sub process {
          if (-f) {
            my $file = $_;
            # on ne traite pas un fichier de même nom que le script
            return if (/^$::PROGRAM$/);
            # on récupère la date de création au format adéquat
            my $cdate = creation_date($file);
            # on ne fait rien si le fichier est déjà dans le bon répertoire
            return if (basename($File::Find::dir) eq $cdate);
            # Arrêt si le répertoire ne peut être créé à cause d'un fichier de même nom
            die "Erreur: le nom '$cdate' est déjà utilisé par un fichier!" if (-f $cdate);
            # On crée le répertoire s'il n'existe pas
            mkdir $cdate unless (-d $cdate);
            # Arrêt si le fichier existe déjà dans le répertoire
            die "Erreur: collision: '$file' existe déjà dans le dossier $cdate!" if (-f $cdate.'/'.$file);
            # on effectue le déplacement du fichier dans le répertoire
            rename $file, $cdate.'/'.$file;
          }
        }
     
        find({ bydepth => 1, wanted => \&process, follow => 1 }, '.');
    Et voici une vidéo montrant ce que cela fait :

    Télécharger la vidéo

Discussions similaires

  1. Besoin d'aide sur un script bash avec redirection et tail
    Par Invité dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 15/09/2014, 14h31
  2. Besoin d'aide sur action script svp
    Par delavega dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 21/03/2014, 11h58
  3. Besoin d'aide sur un script shell
    Par zrzdzdze dans le forum Linux
    Réponses: 2
    Dernier message: 16/02/2012, 09h24
  4. Besoin d'aide sur un script SQL de recherche
    Par agougeon dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/10/2005, 12h40

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