6

当我打开 SQLite 数据库文件时,文件开头有很多可读文本 - 由于文件测试,SQLite 文件被错误过滤掉的可能性有多大-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;
4

2 回答 2

7

perlfunc手册页对 and 有以下-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's 的可靠性,除非您愿意提出一个评估它的定义。

于 2013-01-11T20:19:50.477 回答