Forum Programmation.shell test sur le format de fichier

Posté par  (site web personnel) .
Étiquettes : aucune
0
7
août
2004
Bonjour,
Pour déterminer le format du fichier passer en argument d'un script, j'utilise : file $monfic | grep $monformat

Le probleme est qu'il s'agit d'archives j'ai donc comme format zip gzip et bzip2...

tout me sort en zip :(

J'ai essayé avec file $monfic | grep \<$monformat\> et la ça marche plus (else echo -e "impossible de déterminer le type de $monfic\n")

Question 1 : comment faire pour éviter la confusion entre ces chaînes ?

Question 2 : Y a-t-il un meilleur moyen de connaître le format du fichier ?

Merci
  • # et avec des espaces ?

    Posté par  . Évalué à 1.

    Il suffit de faire un grep sur la chaîne recherchée entourée d'espaces pour reconnaître uniquement ce mot et ça devrait marcher.

    file $monfic | grep -i " $monformat "
    • [^] # Re: et avec des espaces ?

      Posté par  . Évalué à 1.

      Bon, en fait, il y a une erreur car le nom du fichier est dans la sortie de "file" et est reconnu par le grep.

      Je ferais plutôt quelque chose comme ça :

      file -b $monfic | grep -i "^$monformat"
      • [^] # Re: et avec des espaces ?

        Posté par  . Évalué à 2.

        Hello,

        je ne sais pas comment est la sortie de file, et je n'ai pas de manchot sous la main pour tester, mais si le format est le seul mot sur la ligne, je complèterai avec un $ à la fin de la chaîne du grep, afin de ne pas prendre les mots commencant par $monformat.
        Le ^ en début de chaîne prévient bien les gzip et bzip pour zip, mais pas des ziptoto ou zipx si ceux-là existent (bien entendu, l'exemple est foireux ;-) ).

        file -b $monfic | grep -i"^$monformat\$"

        Bonne chance.
  • # test

    Posté par  . Évalué à 0.

    test `file -b $monfic | cut -f1 -d' '` = $monformat
  • # option --brief

    Posté par  . Évalué à 5.

    Tu devrais utiliser aussi l'option « brief » de file pour eviter qu'il renvoit le nom du fichier:
    file -b $monfic | grep "\<$monformat\>"
    Sinon moi j'utiliserai plutot awk:

    FORMAT=$(file -b $monfic | awk '{print $1 }')
    case FORMAT in
    zip) ... ;
    gzip) ... ;
    bzip2) ... ;
    ...) ... ;
    esac
    • [^] # Re: option --brief

      Posté par  . Évalué à 2.

      case $FORMAT in
      • [^] # Re: option --brief

        Posté par  (site web personnel) . Évalué à 2.

        Merci à tous pour vos réponses. C'est agréable de pouvoir communiquer ainsi.

        Je vais utiliser le truc de gnujsa avec awk. Si j'ai bien compris (car j'essaye de comprendre ce que je fais et je ne connais pas awk) $1 représente le premier mot de la sortie de file ($2 le second...).

        Cela me donne d'emblée la chaîne que je recherche et sera plus pratique pour introduire d'autres cas.

        A++
        • [^] # Re: option --brief

          Posté par  . Évalué à 2.

          awk va découper ce qu'il reçoit en champs ( comme les colones d'un tableau ). Par défaut les champs sont délimités par un espace ou une tabulation. Ça corespond donc à un mot. Ça se change avec l'option -F. $1 corespondent au premier champ, $2 au deuxième, etc ... ( rien à voir avec les variables du shell, et c'est pour ça qu'il faut les « protéger » à l'aide des guillemets simples )


          echo 'UID'
          cat /etc/passwd | awk -F: '{ print $3}'


          une petite introduction à awk:
          http://www.shellunix.com/awk.html(...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.