6

SQLiteデータベースファイルを開くと、ファイルの先頭に読み取り可能なテキストがたくさんあります--BファイルテストのためにSQLiteファイルが誤ってフィルタリングされる可能性はどのくらいありますか?

#!/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;
4

2 に答える 2

7

perlfuncのmanページには、次のように書かれてい-Tます-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. 

もちろん、これで、多数のsqliteファイルの統計分析を行い、それらの「最初のブロック程度」で「奇数文字」を解析し、それらの発生確率を計算することができます。これにより、その可能性がどの程度あるかがわかります。-Bsqliteファイルでは失敗します。

ただし、簡単なルートを使用することもできます。失敗することはありますか?はい、それはヒューリスティックです。そして、それは悪いことです。したがって、使用しないでください。

Unixでのファイルタイプの認識は、通常、ファイルの内容を評価することによって行われます。そして、はい、すでにすべての作業を行っている人がいます。それは呼ばれています(コマンドラインツールlibmagicを生成するもの)。fileあなたはそれをPerlから例えばFile::MMagicで使うことができます。

于 2013-01-11T17:23:39.887 に答える
1

ええと、すべてのファイルは技術的にはバイトのコレクションであり、したがってバイナリです。それを超えて、バイナリの受け入れられた定義がないので、それが評価さ-Bれる定義を仮定することを気にしない限り、の信頼性を評価することは不可能です。

于 2013-01-11T20:19:50.477 に答える