Forums FUG-FR
https://forums.fug-fr.org/cgi-bin/yabb2/YaBB.pl
FreeBSD >> Pratique >> renommer par lot une partie des noms de fichiers
https://forums.fug-fr.org/cgi-bin/yabb2/YaBB.pl?num=1342107924

Message started by fabrozor on 12. Jul 2012 at 17:45

Title: renommer par lot une partie des noms de fichiers
Post by fabrozor on 12. Jul 2012 at 17:45
Bonjour,

Je suis "newBSD" (newbie sur BSD).

Ma question va peut être vous sembler nulle mais comme j'ai tout à apprendre je me lance ...
(
AAAA = Annee (4 chiffres)
MM = Mois (2 chiffres)
JJ = Jour (2 chiffres)
HH = heure (2 chiffres)
)

Un collègue génère des fichiers de logs sous la forme :
Domaine_AAAA-MM-JJ.log

Nous devons les générer maintenant chaque heure.
Ca devient donc :
Domaine_AAAA-MM-JJ_HH.log

Sauf qu'il a configuré dans son script le mauvais séparateur "-" au lieu de "_".
Ce qui donne plein de fichiers sous la forme :
Domaine_AAAA-MM-JJ-HH.log au lieu de :
Domaine_AAAA-MM-JJ_HH.log

Le script a été modifié pour mettre le bon séparateur "_"

Mon dossier de logs est donc pollué avec des fichiers qui ont le mauvais format de nom.

Je voudrais renommer ceux qui ont le mauvais format afin qu'ils aient le bon format.

Renommer tous les :
Domaine_AAAA-MM-JJ-HH.log

en :
Domaine_AAAA-MM-JJ_HH.log

- - -

Je pense que la commande "mv" pourrait faire l'affaire mais c'est tous les signes bizarre qu'il faut rajouter derriere qu'il me manque  :o

Vous avez une idée de la commande qu'il faudrait ?

Merci.

Title: Re: renommer par lot une partie des noms de fichiers
Post by Marck on 13. Jul 2012 at 06:58
Salut,

Voici un petit script "didactique" qui devrait faire l'affaire.
Bien sûr comme tu le dis tout est dans le mv. Pour tester, par précaution, tu peux donc le mettre d'abord en commentaire: "#mv $i $NOUVEAU" et voir si le script passe bien.

Bref tests en réel et responsabilités à ta charge :)


Quote:
#!/bin/sh
# Renommer tous les :
# Domaine_AAAA-MM-JJ-HH.log
# en :
# Domaine_AAAA-MM-JJ_HH.log

for i in `ls -1 *-??.log` ; do
     DEBUT=`echo $i | cut -d- -f1-3`
     FIN=`echo $i | cut -d- -f4`
     echo "fichier : $i"
     echo "debut   : $DEBUT"
     echo "fin     : $FIN"
     # Domaine_AAAA-MM-JJ.log ?
     if [ "$FIN" != "" ] ; then
           NOUVEAU=$DEBUT\_$FIN
           echo "nouveau : $NOUVEAU"
           mv $i $NOUVEAU
     fi
done


Marc

Title: Re: renommer par lot une partie des noms de fichiers
Post by fabrozor on 16. Jul 2012 at 20:46
J'ai mal la tête  :o

Merci en tout cas, je vais jouer un peu avec ça.

Title: Re: renommer par lot une partie des noms de fichiers
Post by fabrozor on 17. Jul 2012 at 21:42
Me revoilà.

Alors j'ai essayé ton script et j'ai eu quelques problemes qui m'ont forcé à cogiter plus que d'habitude.

1- j'ai eu du mal avec le /bin/sh, alors je suis passé sur le /usr/local/bin/bash

2- j'avais une erreur sur la ligne : if [ "$FIN" != "" ] ; then
il évaluait bien $FIN mais m'indiquait la valeur évaluée comme "command not found"

3- le masque de recherche *-??.log (double "??") ne prenait pas en compte les *-?.log (simple "?")

4- j'avais un probleme avec NOUVEAU=$DEBUT\_$FIN car il me mettait le caractère "\" dans le nom de fichier. Et si j'enlevais le "\" dans le script, alors $NOUVEAU ne recevait pas de valeur.

Du coup après 1 ou 2 heures passé dans "VI" à triturer le script je suis arrivé au résultat suivant :


Code (]#!/usr/local/bin/bash

function renomer {
     DEBUT=`echo $i | cut -d- -f1-3`
     FIN=`echo $i | cut -d- -f4`
     echo "fichier : $i"
     echo "DEBUT : $DEBUT"
     echo "FIN : $FIN"
     
     if [ "$FIN" != "" ):

; then
           NOUVEAU="$DEBUT"_"$FIN"
           echo "NOUVEAU : $NOUVEAU"
           mv $i $NOUVEAU
     fi
}

for i in `ls -1 *-??.log`
     do renomer
done

for i in `ls -1 *-?.log`
     do renomer
done


:-? Par contre je suis certain qu'il y avait moyen de faire plus simple (ne pas avoir à faire 2 boucles "for i ...") en faisant que le masque de recherche engloble à la fois les -??.log et les -?.log

Et puis, pour les nombreux tests, j'avais aussi un p'tit script pour supprimer et recréer les fichiers à la volée :

[code]#!/usr/local/bin/bash

prefixe="Domaine_2012-07-17-"
suffixe=".log"

rm ./*.log

for i in {1..30}
do
   touch $prefixe$i$suffixe
done[/code]

Title: Re: renommer par lot une partie des noms de fichiers
Post by Marck on 18. Jul 2012 at 08:04
Re,

Je ne saisis pas trop tes déboires notamment pour ce qui est de sh, mais c'est pas bien grave sauf que sh est présent sur tous les systèmes mais pas forcément bash... Bref sh c'est mieux pour les scripts.

Pour le

Quote:
for i in `ls -1 *-??.log`
     do renomer
done
for i in `ls -1 *-?.log`
     do renomer
done


C'est normal qu'il te faille les deux car tu annonces au départ un format *-HH.log (??) mais utilises ensuite aussi un format *-H.log (? ; ton petit script par exemple).

Donc soit tu gardes les ? et les ??

Quote:
for i in `ls -1 *-?.log` `ls -1 *-??.log` ; do
     renomer
done


Soit tu vois si tu peux utiliser *.log qui couvrira les HH comme les H.

Quote:
for i in `ls -1 *.log` ; do
     renomer
done


Enfin sois prudent avec le *.log car il couvrira tous les fichiers .log ; les bons comme les mauvais, etc. Il faut sans doute faire des modifications en conséquence, mais là j'ai un peu la flemme d'y réfléchir ; surtout si les données doivent ensuite encore changer :)

A+

Title: Re: renommer par lot une partie des noms de fichiers
Post by fabrozor on 18. Jul 2012 at 20:28
Tu as raison Marck, j'ai annoncé dabord un format "-HH" mais en fait, quand j'ai vu que mon petit script qui génère les fichiers, mettait les chiffres de 0-9 sans les préfixer d'un 0, je me suis dit que je n'était pas à l'abri d'un "-H". C'est pour ça que ma demande a évolué en cours de route.

Ah bein je ne savais pas qu'on pouvais accumuler les arguments après le "for" comme dans ton

Quote:
for i in `ls -1 *-?.log` `ls -1 *-??.log` ; do
     renomer
done

Encore une chose de bon à savoir ! merci !

Forums FUG-FR » Powered by YaBB 2.5.2!
YaBB Forum Software © 2000-2025. All Rights Reserved.