Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/12/2011, 19h08   #1
Membre du Club
 
Inscription : août 2008
Messages : 223
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 223
Points : 67
Points : 67
Par défaut tri par nom de fichier et boucle

Bonsoir,

je suis pas un pro du shell et je me prends la tête sur un bout de code qui je pense est presque bon. Mais je n'ai pas encore pu le tester car il me manque ce pour quoi je viens ici pour le lancer.

J'explique :

j'ai une vingtaine de fichiers de log nommés comme suit :
toto_1.log
tot_2.log
...
toto_20.log

que je voudrais concaténer dans un seul fichier log : toto.log mais dans l'ordre et dans une boucle; puis supprimer tous les fichiers toto_*.log

Exemple : toto_1.log dans toto.log puis toto_2.log dans toto.log etc...

Voici mon script shell :

Code bash :
1
2
3
4
5
6
var liste_fichiers_log=`ll $MON_CHEMIN/XXX/TOTO_*.log`
	for fichier in $liste_fichiers_log
		do 
			cat $liste_fichiers_log >> "$MON_CHEMIN/XXX/TOTO.log"
			rm -f $liste_fichiers_log		
	done

Alors si ça se trouve, même ce code là est faux mais j'en sais rien encore. Mais de toute façon le problème est pas là : savez vous comment ordonner le traitement de la boucle de façon à ce soit traités les fichiers dans l'ordre...?

Merci d'avance pour votre aide.

Mederik
mederik est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/12/2011, 19h52   #2
Membre du Club
 
Inscription : août 2008
Messages : 223
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 223
Points : 67
Points : 67
Bon finalement,

je me suis corrigé tout seul.
1 - Tout d'abord il semble que le "ll" classe tout seul les fichiers dans le bon ordre
2 - ensuite il ne fallait pas un "ll" mais un "ls"
3 - il ne fallait pas déclarer la variable au tout début "var liste_fichiers_log"
4 - il fallait faire un cat $fichier
et donc le bon code est

Code bash :
1
2
3
4
5
6
liste_fichiers_log=`ls $MON_CHEMIN/XXX/TOTO_*.log`
	for fichier in $liste_fichiers_log
		do 
			cat $fichier >> "$MON_CHEMIN/XXX/TOTO.log"
			rm -f $fichier	
	done
mederik est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 16/12/2011, 22h37   #3
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
Bonjour,

Je n'utilise jamais ls dans un script.

Code bash :
1
2
3
4
repertoire=/ou/tu/veux
Liste=( $repertoire/toto_* )
cat $(printf '%s\n' "${Liste[@]}"|sort -t'_' -k2n) >fichier.out
rm "${Liste[@]}"
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/12/2011, 08h09   #4
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 968
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 968
Points : 1 375
Points : 1 375
Code :
1
2
mc=$MON_CHEMIN/XXX
cat $mc/TOTO_*.log > /tmp/TOTO.log && {rm $mc/TOTO_*.log;mv /tmp/TOTO.log $mc;}
__________________
ɹǝsn *sıɹɐlos*
jlliagre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/12/2011, 08h52   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
ah ? j'ai pris «dans l'ordre» dans le sens où mederik voulait toto_1, toto2_…toto_10
les shells, que j'ai testés, ordonnent comme si les nombres étaient des lettres et non des valeurs numériques.
bash et ksh affichent
toto_10
toto_11
...
toto_19
toto_1
...

pour ash, c'est
toto_1
toto_10
toto_11
...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/12/2011, 14h18   #6
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 968
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 968
Points : 1 375
Points : 1 375
Je n'avais pas vu la subtilité à propos de l'ordre, mais mederik semble se contenter d'un ordre alphanumérique.

Il manque aussi une sécurité a vos scripts: Si le disque est plein au moment où on l'exécute, on pert tous les fichiers ...
__________________
ɹǝsn *sıɹɐlos*
jlliagre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 19/12/2011, 10h29   #7
Membre du Club
 
Inscription : août 2008
Messages : 223
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 223
Points : 67
Points : 67
Citation:
mais mederik semble se contenter d'un ordre alphanumérique
ah... ben non, il faut absolument qu'ils soient dans l'ordre. Mes fichiers sont numérotés comme ceci :
toto_01
toto_02
...toto_10
toto11
etc...

et comme à l'affichage de ma console en faisant un ls ils étaient classés non pas comme ca
Citation:
toto_1
toto_10
toto_11
mais bien comme ceci
toto_01
toto_02
...toto_10
toto11
etc...

alors j'ai assumé que mon ls dans mon petit script le ferait aussi.

Mais si je me suis gouré alors je vais décripter ce que fait
Citation:
Code :
1
2
3
4
repertoire=/ou/tu/veux
Liste=( $repertoire/toto_* )
cat $(printf '%s\n' "${Liste[@]}"|sort -t'_' -k2n) >fichier.out
rm "${Liste[@]}"
et l'implémenter si tu veux bien.

Quand je pense que j'étais fier de mon petit script trouvé tout seul
mederik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h36   #8
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 968
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 968
Points : 1 375
Points : 1 375
Mederik, tes réponses ne sont pas claires.

Tu semble confirmer que tu te contentes du classement alphanumérique puisqu'avec les noms de fichiers que tu montres (toto_01, toto_02, ..., toto_10), ce classement est identique au classement numérique.

Ca ne serait pas le cas si les fichiers étaient nommés toto_1, toto_2, ..., toto_10.

Je te conseille ma suggestion qui est plus portable, plus sûre et plus simple à comprendre que celle utilisant un tableau:

Code :
1
2
mc=$MON_CHEMIN/XXX
cat $mc/TOTO_*.log > /tmp/TOTO.log && {rm $mc/TOTO_*.log;mv /tmp/TOTO.log $mc;}
__________________
ɹǝsn *sıɹɐlos*
jlliagre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h56.


 
 
 
 
Partenaires

Hébergement Web