Problème avec tar dans un script

Problème avec tar dans un script - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 01-02-2012 à 18:07:27    

Bonjour,
 
J'ai un script qui, dans un traitement, doit mettre tous les fichier "ced*met.las*" et "ced*exp.las*" dans un fichier tar.
 
J'ai cherché sur le net comment faire un "ou" avec ls, mais je n'ai pas trouvé.
 
J'ai trouvé qu'on pouvait utiliser *, ? et [] mais pas de notion de ou logique.
 
Qu'à cela ne tienne, j'ai fais deux instructions :
 

Code :
  1. ls ced*met.las* 2>/dev/null
  2. if [ $? = 0 ]
  3. then
  4. # compression des fichiers editions
  5. echo "compression des fichiers MET" >> $fichier
  6. tar cvf ${NOM_FICINT} ced*met.las* >> $fichier 2>&1
  7. fi
  8. ls ced*exp.las* 2>/dev/null
  9. if [ $? = 0 ]
  10. then
  11. # compression des fichiers editions
  12. echo "compression des fichiers EXP" >> $fichier
  13. tar cvf ${NOM_FICINT} ced*exp.las* >> $fichier 2>&1
  14. fi


Mais le code ci-dessus écrase le tar créé dans le permier if (d'ailleurs, pas bien pigé, car il ne l'écrase pas complètement, il reste un des fichiers dedans mais bon).
 
Qu'à cela ne tienne, il suffit que je lance avec Avf la première fois, puis cvf la seconde...
 
Sauf que j'ai un problème : il n'y a pas forcément toujours de fichier "ced*met.las*" ou "ced*exp.las*"
 
Comment :
- Faire un "ls ced*(met|exp).las* 2>/dev/null
- ou bien comment dire à tar de créer ou ajouter de façon automatique selon existence du fichier
 
J'ai tenté de mettre Avf à chaque fois, mais le fichier généré est alors invalide, et je peux plus le untar.

Reply

Marsh Posté le 01-02-2012 à 18:07:27   

Reply

Marsh Posté le 01-02-2012 à 19:49:52    

Salut Magic.
 
Tu sais que tu n'es pas obligé de faire plusieurs commandes distinctes ?
 
Ton script pourrait être résumé en :
 

Code :
  1. ls ced*met.las*  ced*exp.las*  2>/dev/null
  2.     if [ $? = 0 ]
  3.     then
  4.     # compression des fichiers editions
  5.     echo "compression des fichiers MET" >> $fichier
  6.     tar cvf ${NOM_FICINT} ced*met.las* ced*exp.las* >> $fichier 2>&1
  7.     fi

Reply

Marsh Posté le 01-02-2012 à 21:03:22    

Houla que c'est moche !
 
:D
 

Code :
  1. #!/bin/bash
  2. fichier=/tmp/log
  3. shopt -s nullglob
  4. if [[ $(compgen -W ced*met.las*) ]]; then
  5.     # compression des fichiers editions
  6.     echo "compression des fichiers MET" >> $fichier
  7.     tar cvf ${NOM_FICINT} ced*met.las* >> $fichier 2>&1
  8. elif [[ $(compgen -W ced*exp.las*) ]]; then
  9.     # compression des fichiers editions
  10.     echo "compression des fichiers EXP" >> $fichier
  11.     tar cvf ${NOM_FICINT} ced*exp.las* >> $fichier 2>&1
  12. else
  13.     echo >&2 "Aucun fichiers 'ced*met.las*' ou  'ced*exp.las*'"
  14. fi

Reply

Marsh Posté le 01-02-2012 à 21:41:45    

J'ai l'impression que ton script met les fichier MET OU les fichiers EXP, ce qui n'est pas ce que Magic cherche a priori.
 
Et il n'a pas précisé si il faisait du bash ou pas (mais bien bel usage du bash de ta part, j'avoue :) )

Reply

Marsh Posté le 01-02-2012 à 23:33:48    

Oui, tout à fait. Mais la demande est pas claire, je lis :  
 

Citation :

J'ai cherché sur le net comment faire un "ou" avec ls, mais je n'ai pas trouvé.


 
MagicBuzz si tu nous entends :D

Reply

Marsh Posté le 02-02-2012 à 09:38:10    

Bonjour, et merci pour votre réponse très rapide !
 
ccp6128 a bien compris ma demande, c'est un OU logique, donc inclusif que je cherche à reproduire.
 
Donc je veux soit l'un, soit l'autre, soit les deux, selon si l'un, l'autre ou les deux sont présents :)
 
La solution de ccp6128 semble correspondre parfaitement à mon attente.
 
Etant donné que :
1/ j'y connais pas grand chose en script (pas plus qu'à Linux en fait ^^)
2/ que je modifie le script écrit par une autre personne
3/ que cette personne s'y connait pas beaucoup plus que moi
4/ et qu'elle déteste que j'ajoute de nouvelles choses qu'elle ne maîtrise pas
=> je vais donc garder la syntaxe proposée par ccp6128, qui est similaire à l'originale, contrairement à celle de sputnick qui fait appel à des fonctions que je n'ai jamais vu dans les scripts de ma collègue ("shopt -s nullglob" et "compgen" ) et que je ne saurai pas justifier ou corriger en cas de régression ;)

Reply

Marsh Posté le 02-02-2012 à 20:08:44    

Bonjour,
 
J'ai essayé le script de ccp6128, et ça ne semble pas fonctionner.
 
Je n'ai que des fichiers ced*exp* et pas de fichiers ced*met*, et aucun tar n'a été créé.
 
A noter que je suis en script KSH et non BASH.

Reply

Marsh Posté le 08-02-2012 à 17:31:58    

Hum ...
 
Pour quoi pas tout simplement :
 

Code :
  1. [ $(ls ced*met.las*  ced*exp.las*  | wc -l) -gt 0 ] && tar cf fichier.tar ced*met.las*  ced*exp.las*

Reply

Marsh Posté le 11-02-2012 à 10:54:35    

Je sais pas pour ksh, mais en bash tu peux faire ça :

 

ls ced*{met,exp}.las*

 

Du coup avec tar c'est faisable aussi, puisque c'est le bash qui fait l'evaluation de l'expression régulière :

tar -cf toto.tar ced*{met,exp}.las*


Ca me parait plus simple et plus lisible quand même :o


Message édité par e_esprit le 11-02-2012 à 10:55:31

---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Sujets relatifs:

Leave a Replay

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