IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

tri par nom de fichier et boucle


Sujet :

Shell et commandes POSIX

  1. #1
    Membre habitué
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 193
    Points
    193
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre habitué
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 193
    Points
    193
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    Bonjour,

    Je n'utilise jamais ls dans un script.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    repertoire=/ou/tu/veux
    Liste=( $repertoire/toto_* )
    cat $(printf '%s\n' "${Liste[@]}"|sort -t'_' -k2n) >fichier.out
    rm "${Liste[@]}"

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mc=$MON_CHEMIN/XXX
    cat $mc/TOTO_*.log > /tmp/TOTO.log && {rm $mc/TOTO_*.log;mv /tmp/TOTO.log $mc;}

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    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
    ...

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    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 ...

  7. #7
    Membre habitué
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 193
    Points
    193
    Par défaut
    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
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mc=$MON_CHEMIN/XXX
    cat $mc/TOTO_*.log > /tmp/TOTO.log && {rm $mc/TOTO_*.log;mv /tmp/TOTO.log $mc;}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Tri sur noms de fichiers
    Par Invité dans le forum C#
    Réponses: 1
    Dernier message: 27/03/2013, 11h08
  2. ORDER BY modelId (mais faire tri par nom du modele)
    Par Sayrus dans le forum Requêtes
    Réponses: 5
    Dernier message: 14/02/2011, 16h01
  3. Tri par nom sans doublons et le compter chaque visite
    Par epiouf dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/06/2009, 17h02
  4. [MySQL] Tri par nom de jour de la semaine.
    Par condor_01 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/08/2006, 10h34
  5. Tri par nom de jour de la semaine.
    Par condor_01 dans le forum JDBC
    Réponses: 2
    Dernier message: 21/08/2006, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo