Rename des fichiers avec la date sous Linux 2

Résolu
baborge Messages postés 93 Date d'inscription   Statut Membre Dernière intervention   -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Salut a tous

vous m'avez aider
a renommer tous les fichiers d'un répertoire sous LINUX avec une commande en shell:

#! /usr/bin/perl -w

use strict;

my ($jour,$mois,$annee)=(localtime)[3,4,5];

my $j = sprintf("%02d",$jour);
my $m = sprintf("%02d",$mois+1);
my $a = $annee+1900;

my @fic = glob "/home/ovh/sauveDB/*.sql"; 
foreach (@fic){
        (my $new_name = $_)=~ s/(\d+)(\.sql)/$1_$a-$m-$j$2/;
        rename $_,$new_name;
}


mais lors de ma demande, je n'avais préciser que les fichiers sont sous la forme :

1.sql
2.sql
...
100.sql


alors que j'ai d'autres fichiers dans ce répertoire:

mysql.sql
compteur.sql
etc...


et la commande précédante ne les prends pas en compte...

pouvez vous me donner un coup de main supplémentaire...

Merci d'avance

laurent

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    #! /usr/bin/perl -w
    
    use strict;
    
    my ($jour,$mois,$annee)=(localtime)[3,4,5];
    
    my $j = sprintf("%02d",$jour);
    my $m = sprintf("%02d",$mois+1);
    my $a = $annee+1900;
    
    #my @fic = glob "/home/ovh/sauveDB/*.sql"; pas besoin
    
    foreach (glob "/home/ovh/sauveDB/*.sql"){
     (my $new_name = $_)=~ s/^    # début de chaine
                             (.*) # tout caractère 
                             (?=\.sql)
    			      # test avant .sql (ne consomme pas de texte)
                            /$1_$a-$m-$j/x;
            rename $_,$new_name;
    }
    0
  2. baborge Messages postés 93 Date d'inscription   Statut Membre Dernière intervention   33
     
    Re

    Merci lami20j

    tout marche super

    @+

    laurent
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    de rien.

    Petite question. As-tu compris la pourquoi ton regex ne te satisfaisait pas?
    s/(\d+)(\.sql)/$1_$a-$m-$j$2/


    Et celui là oui?
    s/^      # début de chaine
        (.*) # tout caractère 
        (?=\.sql)
         # test avant .sql (ne consomme pas de texte)
     /$1_$a-$m-$j/x;


    C'est bien de comprendre pourqoui et aussi d'étudier tout les cas puisque la regex que je t'ai donné n'est pas parfaite.

    Comment se comportera elle sur des fichiers dont le nom est

    aaa.SQL

    ou

    aaa.sql.sql

    ou encore

    01.sql.02.sql

    ?

    Même si tu dit que ça ne serez pas le cas, on ne sait jamais.
    A toi de voir.
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    voilà encore un version dans laquelle on n'a pas des références arrières. Un seul test avant pour tester l'extension fait l'affaire.
    #! /usr/bin/perl -w
    
    use strict;
    
    foreach (glob "/home/ovh/sauveDB/*.sql"){
      (my $new_name = $_)=~ s/(?=\.sql)/'_' . `date +%F`/e;
      $new_name =~ s/\n//; # le résultat de date contient un \n
      rename $_,$new_name;
    }
    0