2010-09-07 20 views
6

Come posso verificare se il file è binario o di testo senza aprire il file?linux + verifica se il file è testo o binario

+0

È difficile dire se questo è legato alla programmazione o se deve essere migrato su SuperUser.com (è richiesta un'utilità esistente?). – Johnsyweb

+0

Il testo è al massimo un sottoinsieme di binari, se non semplicemente un'interpretazione. Considera un file di un byte contenente '0x65'. Ora dimmi assolutamente se questo è binario o di testo. – MSalters

+0

per quanto riguarda la copia del file prima di verificare. copia -> apri -> verifica -> cancella –

risposta

2

Non c'è modo di essere certi senza guardare all'interno del file. Ma non è necessario aprirlo con un editor e vedere di persona avere un indizio. Si consiglia di esaminare il comando : http://linux.die.net/man/1/file

9

Il gatto di Schrödinger, ho paura.

Non esiste alcun modo per determinare il contenuto di un file senza aprirlo. Il filesystem non memorizza alcun metadata relativo ai contenuti.

Se non aprire il file non è un requisito irrinunciabile, sono disponibili numerose soluzioni.

Edit:

È stato suggerito in un certo numero di commenti e risposte che file(1) è un buon modo di determinare il contenuto. Certo che lo è. Tuttavia, file(1)apre il file, che era vietato nella domanda. Vedere la penultima riga nel seguente esempio:

> echo 'This is not a pipe' > file.jpg && strace file file.jpg 2>&1 | grep file.jpg 
execve("/usr/bin/file", ["file", "file.jpg"], [/* 56 vars */]) = 0 
lstat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0 
stat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0 
open("file.jpg", O_RDONLY|O_LARGEFILE) = 3 
write(1, "file.jpg: ASCII text\n", 21file.jpg: ASCII text 
+1

Il file di comando unix fa un buon lavoro nel determinare euristicamente il tipo – Joel

+0

@Joel: Sì. Apre anche il file. – Johnsyweb

+1

La domanda è troppo vaga per sapere se "open" significa open (2). "Open" ha altre connotazioni. – camh

2

Se si sta tentando di fare questo da una shell di comando il comando file avrà una congettura a quello tipo di file che è. Se è testo, generalmente includerà la parola testo nella sua descrizione.

Non sono a conoscenza di alcun metodo al 100% per determinare ciò ma il comando file è probabilmente il più accurato.

+1

Ovviamente questo apre il file e non sarà sicuro al 100%. –

+1

In effetti lo fa, anche se non ero sicuro se fosse contrario ad aprire il file da solo o avere un'utilità che lo aprisse. Ho affermato che non esiste un metodo sicuro al 100% per farlo. –

2

In unix, un file è solo alcuni byte. Quindi, senza aprire il file, non puoi capire al 100% che sia ASCII o Binario.

Puoi semplicemente utilizzare gli strumenti disponibili e scavare più a fondo per renderlo infallibile.

  1. file di
  2. cat -v
6

Il modo corretto per determinare il tipo di un file è quello di utilizzare il (1) comando file.

È inoltre necessario tenere presente che i file con codifica UTF-8 sono file "di testo", ma possono contenere dati non ASCII. Anche altre codifiche hanno questo problema. Nel caso di testo codificato con uno code page, potrebbe non essere possibile determinare in modo univoco se un file è testo o meno.

Il file (1) comando guardare la struttura di un file per cercare di determinare ciò che contiene - dal file (1) pagina man:

Il tipo stampata di solito contengono uno dei le parole testo (il file contiene caratteri di stampa solo e pochi caratteri di controllo comune ed è probabilmente sicuro di leggere su un ASCII terminale), eseguibile (il file contiene il risultato della compilazione di un programma in una forma comprensibile a alcuni kernel UNIX o nell'altro), o dati significa niente altro (i dati sono di solito ‘binario’ o non stampabile).

Per quanto riguarda le diverse codifiche dei caratteri, il file (1) l'uomo ha questo da dire:

Se un file non corrisponde a nessuno dei voci nel file magia, è esaminato per vedere se sembra essere un file di testo. ASCII, ISO-8859-x, non- Set di caratteri ASCII estesi a 8 bit (come quelli usati su Macintosh e sistemi PC IBM), Unicode con codifica UTF-8, codificato UTF-16 Unicode, e I set di caratteri EBCDIC possono essere distinti dai diversi intervalli e sequenze di byte che costituiscono testo stampabile in ciascun set. Se un file supera uno di questi test, viene riportato il suo set di caratteri. ASCII, I file ISO-8859-x, UTF-8 e ASCII esteso sono identificati come 'testo' perché saranno quasi leggibili su quasi tutti i terminali; UTF-16 e EBCDIC sono solo 'dati carattere' perché, mentre contengono testo, è il testo che richiede la traduzione prima che possa essere letto.

Quindi, una parte di testo sarà identificato come testo, ma alcuni possono essere identificato come dati di caratteri. Dovrai determinarti se questo è importante per la tua applicazione e prendere le misure appropriate.

Problemi correlati