Welcome, Guest. Please Login or Register
FUG-FR logo
 
  HomeHelpSearchLoginRegister  
 
renommer par lot une partie des noms de fichiers (Read 3094 times)
fabrozor
YaBB Newbies
*
Offline


I Love BSD!

Posts: 6
Gender: male
renommer par lot une partie des noms de fichiers
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  Shocked

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

Merci.
Back to top
 
 
IP Logged
 
Marck
God Member
*****
Offline


I Love New YaBB

Posts: 1113
Re: renommer par lot une partie des noms de fichiers
Reply #1 - 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 Smiley

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
Back to top
 
WWW WWW  
IP Logged
 
fabrozor
YaBB Newbies
*
Offline


I Love BSD!

Posts: 6
Gender: male
Re: renommer par lot une partie des noms de fichiers
Reply #2 - 16. Jul 2012 at 20:46
 
J'ai mal la tête  Shocked

Merci en tout cas, je vais jouer un peu avec ça.
Back to top
 
 
IP Logged
 
fabrozor
YaBB Newbies
*
Offline


I Love BSD!

Posts: 6
Gender: male
Re: renommer par lot une partie des noms de fichiers
Reply #3 - 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 



Huh 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 

Back to top
« Last Edit: 17. Jul 2012 at 22:07 by fabrozor »  
 
IP Logged
 
Marck
God Member
*****
Offline


I Love New YaBB

Posts: 1113
Re: renommer par lot une partie des noms de fichiers
Reply #4 - 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 Smiley

A+
Back to top
« Last Edit: 18. Jul 2012 at 08:16 by Marck »  
WWW WWW  
IP Logged
 
fabrozor
YaBB Newbies
*
Offline


I Love BSD!

Posts: 6
Gender: male
Re: renommer par lot une partie des noms de fichiers
Reply #5 - 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 !
Back to top
 
 
IP Logged