Boucle en bash

Boucle en bash - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 18-05-2009 à 13:55:57    

Bonjour,
je débute en script bash ; c'est pourquoi je me tourne vers vous pour avoir vos conseils.
Je possède un programme assez compliqué accepte deux arguments, le premier est un fichier d'entrée et le second le fichier de sortie. Tous les fichiers de sorties sont de la forme fichier_0xxx où xxx est un nombre à 3 chiffres. Les fichiers d'entrées sont moins uniformes ; ils sont de la forme fichier_0xxx.dat.jour_heure.
Etant donné que j'ai plus d'une centaine de fichier à traiter, j'ai l'idée de faire une boucle pour traiter cela de manière automatique.
Je peux obtenir le nom du fichier d'entrée à l'aide de la commande

Code :
  1. ls /chemin/ |grep xxx


Par exemple, je vais avoir ls /chemin/ | grep 150 qui va me donner fichier_0150.dat.03/05/2009_16:05:12 par exemple.
Je ne sais pas si je suis assez clair mais n'hésitez pas à me poser des questions.

Reply

Marsh Posté le 18-05-2009 à 13:55:57   

Reply

Marsh Posté le 18-05-2009 à 15:46:12    

for i in /chemin/*_0150.dat*
do
    ton_prog $i fichier_sortie
done

Reply

Marsh Posté le 18-05-2009 à 16:54:01    

En fait je me suis mal exprimé, tous les fichier d'entrée ont un numéro différent en plus d'un jour et d'une heure différents. Ils n'ont pas tous 150 dans leur nom. Pour donner une idée de ce que je souhaite faire, j'ai fait ce script (qui ne fonctionne pas) :

Code :
  1. #!/bin/sh
  2. for i in `seq 400 402`
  3. echo "/mon/chemin/complet/">temp
  4. ls /mon/chemin/complet/ | grep $i>>temp
  5. tmp=`cat temp`
  6. echo "$tmp"
  7. monprog $tmp fichier_sortie_0$i
  8. done


Il ne fonctionne pas car dans le fichier temp, les deux infos sont sur deux lignes différentes alors que je voudrais qu'elles soient collées l'une derrière l'autre.
Merci d'avance.

Reply

Marsh Posté le 19-05-2009 à 01:09:36    

Citation :

#!/bin/sh
for i in $(seq 400 402)
do
FilesList=$(ls "/mon/chemin/complet/" | grep $i)
echo -e "/mon/chemin/complet/"${FilesList}""
monprogr /mon/chemin/complet/"${FilesList}" fichier_sortie_0$i
done


Non ?


---------------
La réponse est 42
Reply

Marsh Posté le 19-05-2009 à 01:19:32    

Voici l'une des façons de faire ce que tu veux.
 

Code :
  1. #!/bin/bash
  2. ### Définition du chemin vers le dossier cible###
  3. dir=/chemin/vers/dossier/cible/
  4. ###On boucle dans le dossier cible à la recherche
  5. ###des fichiers correspondant à l'expression régulière
  6. for i in `ls $dir | egrep ^_0[0-9]{3}.dat.*$`
  7. do
  8.    ###Peut ne pas être utile mais s'assure que l'élément est un fichier
  9.    if [ -f "$dir$i" ]; then
  10.         #On fait passer le fichier d'entrée et le fichier de sortie en
  11.         #argument (mise en forme du nom de sortie en sélectionnant les 5
  12.         #premiers octets du nom du fichier d'entrée (_0xxx)
  13.         monprogramme "$dir$i" "$dir$(echo $i | cut -b 1-5)"
  14.    fi
  15. done


Message édité par eze203 le 19-05-2009 à 01:21:21
Reply

Marsh Posté le 28-05-2009 à 02:44:32    

eze203, c'est crade...
 
for i in $dir/_0[0-9][0-9][0-9].dat*; do DoSomethingWith "$i"; done

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed