2013-01-11 6 views
6

Quando apro un file di database SQLite c'è un sacco di testo leggibile all'inizio del file - quanto è grande la possibilità che un file SQLite venga filtrato erroneamente a causa del test del file -B?Quanto è affidabile il test del file -B?

#!/usr/bin/env perl 
use warnings; 
use strict; 
use 5.10.1; 
use File::Find; 

my $dir = shift; 
my $databases; 

find({ 
    wanted  => sub { 
     my $file = $File::Find::name; 
     return if not -B $file; 
     return if not -s $file; 
     return if not -r $file; 
     say $file; 
     open my $fh, '<', $file or die "$file: $!"; 
     my $firstline = readline($fh) // ''; 
     close $fh or die $!; 
     push @$databases, $file if $firstline =~ /\ASQLite\sformat/; 
    }, 
    no_chdir => 1, 
}, 
$dir); 

say scalar @$databases; 
+0

Non penso che i dettagli di '-T' e' -B' siano documentati, il che significa che potrebbero cambiare nelle versioni future di Perl, suppongo. Quindi, di nuovo, ciò li renderebbe inutili ... Una buona risposta a questa domanda descriverebbe i dettagli dell'euristica. Mi sono sempre chiesto me stesso – Nemo

+0

Sono documentati in perlfunc, dove sono documentati tutti gli operatori di file. La descrizione è vaga, però. –

risposta

7

La pagina perlfunc uomo ha il seguente da dire su -T e -B:

The -T and -B switches work as follows. The first block or so of the file is 
examined for odd characters such as strange control codes or characters with 
the high bit set. If too many strange characters (>30%) are found, it's a -B 
file; otherwise it's a -T file. Also, any file containing a zero byte in the 
first block is considered a binary file. 

Naturalmente si potrebbe ora fare un'analisi statistica di una serie di file di SQLite, analizzare il loro "primo blocco o quindi "per" caratteri dispari ", calcola la probabilità della loro occorrenza e ciò ti darebbe un'idea di quanto sia probabile che -B non riesca per i file sqlite.

Tuttavia, si potrebbe anche fare il percorso facile. Può fallire? Sì, è un euristico. E uno cattivo. Quindi non usarlo.

Il riconoscimento del tipo di file su Unix viene generalmente eseguito valutando il contenuto del file. E sì, ci sono persone che hanno già fatto tutto il lavoro per te: si chiama libmagic (il coso che produce lo strumento da riga di comando file). Puoi usarlo da Perl con ad es. File::MMagic.

1

Bene, tutti i file sono tecnicamente una raccolta di byte e quindi binari. Oltre a ciò, non esiste una definizione accettata di binario, quindi è impossibile valutare l'affidabilità di -B a meno che non ci si interessi a una definizione da cui deve essere valutata.