file
utilizza diversi tipi di test :
1: Se il file non esiste, non può essere letto o non è possibile determinarne lo stato, l'output deve indicare che il file è stato elaborato, ma che non è stato possibile determinarne il tipo.
Questo sarà prodotto come cannot open file: No such file or directory
.
2: Se il file non è un file normale, deve essere identificato il suo tipo di file. La directory dei tipi di file, FIFO, socket, blocco speciale e carattere speciale devono essere identificati come tali. Altri tipi di file definiti dall'implementazione possono anche essere identificati. Se il file è un collegamento simbolico, per impostazione predefinita il collegamento deve essere risolto e il file deve verificare il tipo di file a cui fa riferimento il collegamento simbolico. (Vedi le opzioni -h
e di -i
seguito).
Questo sarà prodotto come .: directory
e /dev/sda: block special
. Gran parte del formato per questo e il punto precedente è parzialmente definito da POSIX : è possibile fare affidamento su determinate stringhe nell'output.
3: Se la lunghezza del file è zero, deve essere identificato come un file vuoto.
Questo è foo: empty
.
4: L'utilità del file deve esaminare un segmento iniziale di file e fare un'ipotesi per identificare il suo contenuto sulla base di test sensibili alla posizione. (La risposta non è garantita per essere corretta; vedere le opzioni -d, -M e -m di seguito.)
5: L'utilità del file deve esaminare il file e fare un'ipotesi per identificare il suo contenuto sulla base di test di sistema predefiniti sensibili al contesto. (La risposta non è garantita per essere corretta.)
Questi due usano l' identificazione del numero magico e sono la parte più interessante del comando. Un numero magico è una sequenza speciale di byte che si trova in una posizione nota in un file che ne identifica il tipo. Tradizionalmente quel posto è i primi due byte, ma il termine è stato ulteriormente esteso per includere stringhe più lunghe e altre posizioni. Vedi questa altra domanda per maggiori dettagli sui numeri magici nel file
comando.
Il file
comando ha un database di questi numeri e il tipo a cui corrispondono; quel database è di solito in /usr/share/mime/magic
, e mappa il contenuto del file ai tipi MIME . L'output lì (spesso parte file -i
se non lo ottieni per impostazione predefinita) sarà un tipo di supporto definito o un'estensione. I "test sensibili al contesto" usano lo stesso tipo di approccio, ma sono un po 'più sfocati. Nessuno di questi è garantito per essere giusto, ma sono destinati a essere buone supposizioni.
file
ha anche un database che associa questi tipi ai nomi, mediante i quali saprà che un file identificato come application/pdf
può essere descritto come a PDF document
. Quei nomi leggibili dall'uomo possono anche essere localizzati in un'altra lingua. Sarà sempre una descrizione di alto livello del tipo di file in un modo che una persona capirà, piuttosto che una macchina.
La maggior parte delle diverse uscite che puoi ottenere provengono da queste fasi. Puoi guardare il magic
file per un elenco di tipi supportati e come sono identificati: il mio sistema conosce 376 tipi diversi. I nomi forniti e i tipi supportati sono determinati dalla confezione e dalla configurazione del sistema, quindi il sistema potrebbe supportare più o meno dei miei, ma generalmente ce ne sono molti. libmagic
include anche ulteriori test codificati.
6: il file deve essere identificato come un file di dati.
Questo è foo: data
quando non è riuscito a capire nulla del file.
Ci sono anche altri piccoli tag che possono apparire. Un file eseguibile ( +x
) includerà " executable
" nell'output, generalmente separato da virgole. L' file
implementazione potrebbe anche sapere cose extra su alcuni formati di file per poter descrivere punti aggiuntivi su di essi, come nel tuo " PDF document, version 1.4
".