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 GNU Discussion :

Comment fonctionne la commande file ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Par défaut Comment fonctionne la commande file ?
    Bonjour à tous,

    voila quand je fais un file sur n'importe quel fichier, je recois en sortie de terminal si le fichier est un ELF 64-bit, un ASCII text, un fichier audio stereo avec la vitese de lecture ~11200bps ...

    comment le programme file sait tout ca ?

    est ce que lorsque je lance un programme pour lire un fichier audio, dans ce fichier audio il y a un header au début du fichier pour savoir de quel fichier il s'agit, connaitre la vitesse de lecture (pour un film, une music) ?

    merci d'avance pour votre aide

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Dans l'absolu, il n'en sait rien, comme tout le monde.
    Mais il y a quand même les octets magiques.
    Et des fichiers spécifiques ont des formats spécifiques.

    Exemple : Les fichiers pdf commencent par "%pdf"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ for i in ~/Documents/*.pdf; do od -c "$i" |head -n 1;done                                                                                                                                                                                                      
    0000000   %   P   D   F   -   1   .   4  \n   % 303 244 303 274 303 266
    0000000   %   P   D   F   -   1   .   4  \r   % 342 343 317 323  \r  \n
    0000000   %   P   D   F   -   1   .   4  \n   % 307 354 217 242  \n   5
    0000000   %   P   D   F   -   1   .   4  \n   % 320 324 305 330  \n   3
    0000000   %   P   D   F   -   1   .   3  \n   % 304 345 362 345 353 247
    0000000   %   P   D   F   -   1   .   5  \n   % 320 324 305 330  \n   3
    0000000   %   P   D   F   -   1   .   3  \n   % 307 354 217 242  \n   8
    0000000   %   P   D   F   -   1   .   4  \n   % 252 253 254 255  \n   1
    0000000   %   P   D   F   -   1   .   1  \r  \n   % 342 343 317 323  \r
    Exemple : Les fichiers image png commencent par ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ for i in ~/Documents/*.png; do od -c "$i" |head -n 1;done
    0000000 211   P   N   G  \r  \n 032  \n  \0  \0  \0  \r   I   H   D   R
    0000000 211   P   N   G  \r  \n 032  \n  \0  \0  \0  \r   I   H   D   R
    0000000 211   P   N   G  \r  \n 032  \n  \0  \0  \0  \r   I   H   D   R
    0000000 211   P   N   G  \r  \n 032  \n  \0  \0  \0  \r   I   H   D   R
    0000000 211   P   N   G  \r  \n 032  \n  \0  \0  \0  \r   I   H   D   R
    Si un fichier n'a que des octets qui correspondent à des lettres ascii ... c'est un indice.

    etc.

    Pour aller plus loin :

  3. #3
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Par défaut
    merci beaucoup pour ta réponse, j'ai essayé de retrouver les octets magique via hexdump mais je ne trouve rien.

    par exemple dans un fichier coco.txt qui contient la lettre a

    hexdump coco.txt retourne :

    0000000 0a61
    0000002

    0a61 est compréhensible mais le reste correspond qu'a des octets NULL pour le code ascii

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Un fichier plat n'a pas d'octet magique.
    Mais son texte brut.
    Cependant si c'est vraiment du texte brut, les caractères sont imprimables.
    C'était le sens de mon troisième exemple.


    The type printed will usually contain one of the words text (the file contains only printing characters and a few common control characters and is probably safe to read on an ASCII terminal), executable (the file contains the result of compiling a program in a
    form understandable to some UNIX kernel or another), or data meaning anything else (data is usually “binary” or non-printable). Exceptions are well-known file formats (core files, tar archives) that are known to contain binary data. When adding local defini‐
    tions to /etc/magic, make sure to preserve these keywords. Users depend on knowing that all the readable files in a directory have the word “text” printed. Don't do as Berkeley did and change “shell commands text” to “shell script”.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Pour info, les fichiers contenant du texte UNICODE peuvent commencer par un BOM (cf. wikipedia BOM)

  6. #6
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Par défaut
    ok mais comment il peut savoir s'il s'agit d'octet magique et non d'un fichier plat (en ascii).

    si je crée un fichier texte.txt et je met dedans ELF, la commande file ne va pas me retourner que ce fichier est un exécutable, pourtant dans mes fichier binaires les 3 premiers octets sont ELF

  7. #7
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Par défaut
    dans le code ascii on a 0x01 qui représente le début de l'entete, c'est avec ca qu'il regarde la suite des octets pour savoir de quel fichier il s'agit ?

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Citation Envoyé par cosmoff Voir le message
    ok mais comment il peut savoir s'il s'agit d'octet magique et non d'un fichier plat (en ascii).

    si je crée un fichier texte.txt et je met dedans ELF, la commande file ne va pas me retourner que ce fichier est un exécutable, pourtant dans mes fichier binaires les 3 premiers octets sont ELF
    Tu n'as même pas lu le man !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
         This manual page documents version 5.30 of the file command.
    
         file tests each argument in an attempt to classify it.  There are three sets of tests, performed in this order: filesystem tests, magic tests, and language tests.  The first test that succeeds causes the file type to be printed.
    
         The type printed will usually contain one of the words text (the file contains only printing characters and a few common control characters and is probably safe to read on an ASCII terminal), executable (the file contains the result of compiling a program in a
         form understandable to some UNIX kernel or another), or data meaning anything else (data is usually “binary” or non-printable).  Exceptions are well-known file formats (core files, tar archives) that are known to contain binary data.  When adding local defini‐
         tions to /etc/magic, make sure to preserve these keywords.  Users depend on knowing that all the readable files in a directory have the word “text” printed.  Don't do as Berkeley did and change “shell commands text” to “shell script”.
    
         The filesystem tests are based on examining the return from a stat(2) system call.  The program checks to see if the file is empty, or if it's some sort of special file.  Any known file types appropriate to the system you are running on (sockets, symbolic links,
         or named pipes (FIFOs) on those systems that implement them) are intuited if they are defined in the system header file <sys/stat.h>.
    
         The magic tests are used to check for files with data in particular fixed formats.  The canonical example of this is a binary executable (compiled program) a.out file, whose format is defined in <elf.h>, <a.out.h> and possibly <exec.h> in the standard include
         directory.  These files have a “magic number” stored in a particular place near the beginning of the file that tells the UNIX operating system that the file is a binary executable, and which of several types thereof.  The concept of a “magic” has been applied by
         extension to data files.  Any file with some invariant identifier at a small fixed offset into the file can usually be described in this way.  The information identifying these files is read from /etc/magic and the compiled magic file /usr/share/misc/magic.mgc,
         or the files in the directory /usr/share/misc/magic if the compiled file does not exist.  In addition, if $HOME/.magic.mgc or $HOME/.magic exists, it will be used in preference to the system magic files.
    
         If a file does not match any of the entries in the magic file, it is examined to see if it seems to be a text file.  ASCII, ISO-8859-x, non-ISO 8-bit extended-ASCII character sets (such as those used on Macintosh and IBM PC systems), UTF-8-encoded Unicode,
         UTF-16-encoded Unicode, and EBCDIC character sets can be distinguished by the different ranges and sequences of bytes that constitute printable text in each set.  If a file passes any of these tests, its character set is reported.  ASCII, ISO-8859-x, UTF-8, and
         extended-ASCII files are identified as “text” because they will be mostly readable on nearly any terminal; UTF-16 and EBCDIC are only “character data” because, while they contain text, it is text that will require translation before it can be read.  In addition,
         file will attempt to determine other characteristics of text-type files.  If the lines of a file are terminated by CR, CRLF, or NEL, instead of the Unix-standard LF, this will be reported.  Files that contain embedded escape sequences or overstriking will also
         be identified.
    
         Once file has determined the character set used in a text-type file, it will attempt to determine in what language the file is written.  The language tests look for particular strings (cf.  <names.h>) that can appear anywhere in the first few blocks of a file.
         For example, the keyword .br indicates that the file is most likely a troff(1) input file, just as the keyword struct indicates a C program.  These tests are less reliable than the previous two groups, so they are performed last.  The language test routines also
         test for some miscellany (such as tar(1) archives).
    
         Any file that cannot be identified as having been written in any of the character sets listed above is simply said to be “data”.

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

Discussions similaires

  1. Comment fonctionne la commande sort?
    Par AntoineCompagnie dans le forum Unix
    Réponses: 1
    Dernier message: 05/01/2016, 12h43
  2. Commande FILE et lib qui ne fonctionne pas
    Par gargle dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 16/10/2013, 11h51
  3. Comment fonctionne le ClassExplorer ?
    Par borisd dans le forum C++Builder
    Réponses: 7
    Dernier message: 30/09/2004, 17h44
  4. Comment envoyer une commande à une console ?
    Par seb_asm dans le forum Assembleur
    Réponses: 3
    Dernier message: 27/03/2004, 14h09
  5. Comment fonctionne le CVS ?
    Par mathieu dans le forum CVS
    Réponses: 6
    Dernier message: 23/03/2004, 11h26

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