Commande rename avec variable

Résolu
pcsystemd Messages postés 734 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

Je déclare la variable suivante :

DATE=`date '+%d%m%Y'`

si je fais un

echo ${DATE}
09082022

J'ai bien la date.

Par contre si je fais un 

rename 's/.txt/_${DATE}.txt/' *
Global symbol "$DATE" requires explicit package name (did you forget to declare "my $DATE"?) at (user-supplied code).

Une idée?

Merci
 


L'accès au savoir est la première liberté que chaque homme devrait avoir.

6 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     

    Bonjour,

    Je ne sais pas ce que c'est que c'est que cette commande "rename", mais elle n'est pas standard. Pour renommer un fichier, normalement, on utilise simplement mv.

    Si tu veux renommer des fichiers, le plus simple est peut être de faire une boucle for. Dans la commande suivante :

    • find . liste les fichiers à partir du dossier courant ;
    • grep "\.txt$" ne conserve que les fichiers dont le nom se termine par ".txt"
    • mv est utilisé pour renommer le fichier courant ($x) comme tu le souhaites.
    for x in $(find . | grep "\.txt$"); do mv "$x" "$(dirname $x)/$(date '+%d%m%Y')_$(basename $x)"; done
    

    Bonne chance

    1
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     

    hello

    essayer

    export DATE=$(date '+%d%m%Y')
    rename -n 's/.txt/$ENV{DATE}.txt/' *

    enlever le -n si ok

    1
  3. pcsystemd Messages postés 734 Statut Membre 23
     

    Certes elle n'est pas standard mais elle existe.

    Merci pour la boucle.


    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       

      En tout cas si tu parles de cette commande elle ne semble pas supporter pas d'expression à la sed d'après la documentation.

      De rien pour la boucle, et bonne continuation ;-)

      0
  4. pcsystemd Messages postés 734 Statut Membre 23
     

    Merci dubcek.

    Le souci c'est que c'est pour un script bash et je ne peux pas faire un export car on a différentes variables qui se noment identiques DATE mais avec des valeurs différentes.


    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       

      je na'i pas compris

      on peut faire

      DATE=$(date '+%d%m%Y'); export DATE
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pcsystemd Messages postés 734 Statut Membre 23
     

    @mamiemando

    Dans ta boucle la date est ajoutée en début de fichier comme cela :

    10082022_file.txt

    J'ai essayé en modifiant l'emplacement de la date dans la boucle for mais je n'arrive pas a voir ce que je souhaiterais c'est à dire :

    file_10082022.txt

    Une idée?

    Merci


    0
  7. pcsystemd Messages postés 734 Statut Membre 23
     

    Cela fonctionne pour moi.

    Merci à vous deux.

    for file in *.txt
    do
      name=`echo "$file" | cut -d'.' -f1`
      ext=`echo "$file" | cut -d'.' -f2`
      mv $file "$name"_`date +%Y%m%d`".$ext"
    done

    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       

      Le code comporte quelques erreurs :

      • Il ne marche que si te restreins aux fichiers du dossier courant, mais dès que tu veux l'appliquer récursivement à ses sous dossiers, il vaudrait mieux adapter la solution #1 et utiliser dirname et basename. 
      • Si des fichiers comportent des espaces, le mv échouera car tu n'as pas entouré $file avec des guillemets. Et il y a plein d'autres petits pièges (voir ce lien et ce lien).

      Voici à quoi il pourrait ressembler

      #!/bin/bash
       
      find . -type f | grep "\.txt$" | while read path
      do
          dir=$(dirname "$path")
          file=$(basename "$path")
          name=$(echo "$file" | cut -d'.' -f1)
          ext=$(echo "$file" | cut -d'.' -f2)
          echo mv "$dir/$file" "${dir}/${name}_$(date +%Y%m%d).${ext}"
      done

      Bonne chance

      0