4.6.4 I formati dei file

Un file contiene una sequenza di byte che assumono significati diversi dipendentemente dal modo in cui questi vengono interpretati: ciò determina il formato del file. Se l’interpretazione dei byte contenuti in un file deve essere fatta mediante la tabella ASCII, allora si ha a che fare con un file in formato testo, altrimenti si parla genericamente di file in formato binario.

Di seguito è riportata la visualizzazione rispettivamente di un file in formato binario (per la precisione si tratta di un file che contiene un immagine secondo il formato PNG - Portable Network Graphic) e di uno in formato testo. Il file binario è il seguente

?PNG
IHDR0 W ?? bKGD???????  pHYs     ??~?tIME?  7/-0??IDATx???A
?U? ?  y ?X8?hS??? AE??0?F`  ? ??u>i?#  #? 0??="""""r ?}?? C??EgV??P??i?$????ciV
L?mY?????OiV8C (?5? ?m?Z) ?  ???+ ? HS?@,  ??? Z???Xo'?? ò?&8?e-ç??S?c "RD??U?^
??P??1? ^ ?cIEND?B`?xtermxtermxtermxterm
mentre il file di testo è visualizzato in maniera comprensibile

Ciao,
Questo è un esempio di file di testo.
Come verrà fuori?
Ciao a tutti,
Daniele.
Questo deriva dal fatto che il comando utilizzato per la visualizzazione del file è cat, che invia i byte contenuti nel file, uno dopo l’altro, sullo standard output che li visualizza interpretandoli secondo l’ASCII.

In particolare, si parla di formato testo puro quando un file non contiene nessun carattere di controllo speciale, ovvero è composto soltanto da caratteri alfanumerici, segni di punteggiatura e poco altro. Nessuna sequenza di caratteri assume un significato particolare, ogni carattere rappresenta letteralmente quello che è: si dice in tal caso che il file non ha nessun tipo di formattazione. A tale tipo appartengono la totalità degli script e la quasi totalità dei file di configurazione di un sistema Unix-like.

L’unica formattazione di un file in formato testo puro è relativa alla rappresentazione del carattere di fine riga: i sistemi Unix-like utilizzano il carattere ASCII LF, mentre i sistemi che derivano dal DOS usano la sequenza di caratteri CR e LF, ed i sistemi Apple utilizzano soltanto il carattere CR.

Il comando file (man page file(1)) fornisce indicazioni sul formato di un file effettuando tre tipi di test, nel seguente ordine
  1. filesystem - controlla il valore di ritorno della system call stat: viene controllato se il file in questione è vuoto o è di tipo particolare (socket, symbolic link, fifo).
  2. magic number - controlla il valore di particolari byte del file, detti appunto magic number. L’elenco dei magic number e la loro posizione relativa all’inizio del file sono contenuti nel file /usr/share/magic.
  3. language - tenta di ricavare il tipo di lingua utilizzato nel file, se questo è in formato testo.

Il tipo di file visualizzato da file è quello relativo al primo test che va a buon fine. I file che non sono riconosciuti da file, vengono segnalati come data file (file contenenti dei dati non meglio specificati).

____________________________________________________________________

Comando: file
Path: /usr/bin/file

SINTASSI  
$ file [option] file ...  
DESCRIZIONE

_____________

Ad esempio, il seguente comando controlla il tipo dei file file.c, /usr/bin/file (il file eseguibile del comando file stesso) e /dev/hda (file di dispositivo).

$ file file.c /usr/bin/file /dev/hda
file.c:   C program text
/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1,
               dynamically linked, not stripped
/dev/hda: block special
Il seguente comando mostra invece informazioni più dettagliate sui file di dispositivo /dev/hda, /dev/hda1, ..., /dev/hda10.

$ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
/dev/hda:   x86 boot sector
/dev/hda1:  Linux/i386 ext2 filesystem
/dev/hda2:  x86 boot sector
/dev/hda3:  x86 boot sector, extended partition table
/dev/hda4:  Linux/i386 ext2 filesystem
/dev/hda5:  Linux/i386 swap file
/dev/hda6:  Linux/i386 swap file
/dev/hda7:  Linux/i386 swap file
/dev/hda8:  Linux/i386 swap file
/dev/hda9:  empty
/dev/hda10: empty
L’elenco dei magic number riconosciuti è conenuto nel file /usr/share/magic. In realtà ogni riga di tale file indica un controllo da effettuare ed ha la seguente sintassi

 
offset type message  
dove

Una riga può iniziare anche con il carattere ‘>’, che indica ulteriori test da effettuare. Il numero di caratteri ‘>’ indica il livello del test: una riga in cui non è presente nessun carattere iniziale ‘>’ è considerata a livello 0 e le righe a livello n sono sotto il controllo di quella precedente e più prossima a livello n - 1, nel senso che un test a livello n va a buon fine, vengono effettuati anche i test di livello n + 1. Se il carattere che segue l’ultimo ‘>’ è ‘(’ il contenuto in parentesi è considerato come indirect offset relativo al file, ovvero viene letto il contenuto del file a partire da tale offset ed il valore letto viene considerato l’offset relativo al file a partire dal quale si deve effettuare il test. L’indirect offset è specificato con la seguente sintassi

 
(offset[.[length]][plus])  
dove

Un esempio di una parte del contenuto del file /usr/share/magic (quella relativa al riconoscimento dei file compressi con gzip) è riportato di seguito

# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
#   Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002
#       * Original filename is only at offset 10 if "extra field" absent
#       * Produce shorter output - notably, only report compression methods
#         other than 8 ("deflate", the only method defined in RFC 1952).
0       string          \037\213        gzip compressed data
>2      byte            <8              \b, reserved method
>2      byte            >8              \b, unknown method
>3      byte            &0x01           \b, ASCII
>3      byte            &0x02           \b, continuation
>3      byte            &0x04           \b, extra field
>3      byte&0xC        =0x08
>>10    string          x               \b, was "%s"
>9      byte            =0x00           \b, from MS-DOS
>9      byte            =0x01           \b, from Amiga
>9      byte            =0x02           \b, from VMS
>9      byte            =0x03           \b, from Unix
>9      byte            =0x05           \b, from Atari
>9      byte            =0x06           \b, from OS/2
>9      byte            =0x07           \b, from MacOS
>9      byte            =0x0A           \b, from Tops/20
>9      byte            =0x0B           \b, from Win/32
>3      byte            &0x10           \b, comment
>3      byte            &0x20           \b, encrypted
### >4  ledate          x               last modified: %s,
>8      byte            2               \b, max compression
>8      byte            4               \b, max speed