Comando file Linux che classifica i file


17

Devo riconoscere il tipo di dati contenuti in file casuali. Sono nuovo di Linux.

Sto programmando di utilizzare il filecomando per capire che tipo di dati ha un file. Ho provato quel comando e ho ottenuto l'output di seguito.

Qualcuno mi ha suggerito che il filecomando esamina i byte iniziali di un file per determinare il tipo di dati. Il filecomando non esamina affatto un'estensione di file. È corretto? Ho guardato la pagina man ma ho pensato che fosse troppo tecnico. Gradirei se qualcuno potesse fornire un collegamento che ha una spiegazione molto più semplice su come funziona il filecomando.

Quali sono le diverse possibili risposte che potrei ottenere dopo aver eseguito il filecomando? Ad esempio, nella trascrizione seguente ottengo JPEG, ISO, ASCII, ecc:

L'output dello schermo è il seguente

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


Aggiornamento 1

Grazie per le risposte e mi hanno chiarito un paio di cose.

Quindi se capisco correttamente la cartella / usr / share / mime / magic ha un database che mi darà quali sono gli attuali formati di file possibili (output che posso ottenere quando digito il comando file e lo seguo da un file). è corretto? È vero che ogni volta che l'output del comando 'File' contiene la parola "testo" si riferisce a qualcosa che puoi leggere con un visualizzatore di testo, e qualsiasi cosa senza "testo" è una sorta di binario?


6
In futuro, pubblicare un'immagine dell'uscita del terminale non è davvero raccomandato (o apprezzato da nessuno). Usa la formattazione del blocco del codice markdown.
HalosGhost

3
Ho rimosso l'immagine e pubblicato il codice.
user2543622

Proprio come una nota: se il file non è in grado di identificare un file, spesso TrID può farlo . ha un proprio database di caratteristiche dei file, creato dalla comunità che lo utilizza.
Josef dice di reintegrare Monica il

Risposte:


13

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 -he di -iseguito).

Questo sarà prodotto come .: directorye /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 filecomando.

Il filecomando 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 -ise 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.

fileha anche un database che associa questi tipi ai nomi, mediante i quali saprà che un file identificato come application/pdfpuò 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 magicfile 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. libmagicinclude anche ulteriori test codificati.

6: il file deve essere identificato come un file di dati.

Questo è foo: dataquando 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' fileimplementazione 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".


8

Le pagine man sono di solito riferimenti concisi, non introduzioni. Inizia con la pagina di Wikipedia .

fileguarda solo il contenuto del file, non il nome del file. (Esamina anche alcuni metadati di file come il tipo di file: directory, collegamento simbolico, named pipe, ecc. Ma nei casi che ti interessano, è il contenuto che conta.)

filedi solito indovina il formato di un file osservando i primi byte e confrontandoli con una tabella integrata di numeri magici . Ad esempio, se il file inizia con %PDF, fileriporta "documento PDF" (e continua a scavare per segnalare la versione minima). Per i tipi di file che non iniziano con numeri magici, contiene euristiche, ad esempio segnala "testo ASCII" se i primi byte sono tutti nell'intervallo ASCII stampabile.

L'output di fileè fragile: può variare da variante unix a variante unix e da versione a versione. Su Linux, Cygwin e * BSD, il filecomando supporta un'opzione -iche produce output prevedibili sotto forma di un tipo di supporto MIME (IANA gestisce l' elenco dei tipi di supporto standard ). Non ci sono molti dettagli e l'output è meno amico dell'uomo, ma l'output è prevedibile e amico del computer.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

Utilizzare file --mime-typese si desidera solo il tipo MIME stesso senza codificare le informazioni, ad es application/pdf. Passare l'opzione -bse non si desidera visualizzare il nome del file all'inizio della riga.


5

Vorrei che tu leggessi la risposta da qui . Alcuni degli estratti della risposta sono,

Dalla pagina man di filecomando,

file Il comando esegue effettivamente 3 test per determinare il tipo di file.

Primo test

I test del filesystem si basano sull'esame del ritorno da una chiamata di sistema stat (2).

Secondo test

I test dei numeri magici vengono utilizzati per verificare la presenza di file con dati in particolari formati fissi.

Terzo test

I test del linguaggio cercano stringhe particolari (cf names.h) che possono apparire ovunque nei primi blocchi di un file. Ad esempio, la parola chiave .br indica che il file è molto probabilmente un file di input troff (1), proprio come la parola chiave struct indica un programma C.

L'output del filecomando si basa generalmente sul risultato di uno dei test che hanno esito positivo.

Ora, supponendo che il programma C ++ inizi in questo modo e il terzo test abbia esito positivo,

#include <iostream.h>
bla
bla

Come per il terzo test, la parola chiave #includespecifica in particolare che è di tipo C , anche se abbiamo in mano un programma CPP . Ora, quando controllo,

$ file example.cpp

example.cpp: ASCII C program text

Ora, i concetti di orientamento agli oggetti sono specifici del C ++. Creiamo un file specifico per C ++ .

Inizio il mio programma C ++ come,

Class something
{
}
bla
bla

Ora, quando rilascio

$ file example.cpp

L'output è,

example.cpp: ASCII C++ program text

Questo in sostanza spiega come filefunziona il comando su file simili (in questo esempio, il programma C e il programma C ++ sono trattati allo stesso modo a meno che e fino a quando non utilizziamo le funzionalità orientate agli oggetti specifiche del C ++).


1

Gilles e Michael Homer hanno fornito risposte eccellenti. a cui ti rimando. Per vedere i tipi di file riconosciuti sul tuo sistema, prova a eseguire

cat /usr/share/magic

Se ciò dà problemi di autorizzazione, o non esiste, quindi possibilmente

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(potrebbe essere necessario apportare modifiche a seconda del sistema) che dovrebbe mostrare un elenco di tipi di file sul sistema. L'esecuzione di questo comando potrebbe richiedere molto tempo a seconda della dimensione del file system di root.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.