LINUX是如何识别文件类型的?

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
九天星
帖子: 1440
注册时间: 2007-07-14 20:45

LINUX是如何识别文件类型的?

#1

帖子 九天星 » 2015-11-05 20:16

昨天,在下载一个视频文件之后,文件名自已变了,变成一些字母和数字,没有类似于WINDOWS下的扩展名,但图标还是显示的是视频文件,也能正常打开,如此,引发思考如下:
问题一:在使用WINDOWS的时候,我识别文件类型是根据扩展名去判断;那么,我在LINUX下,我应该根据什么去判断一个文件的类型呢???

问题二:或者说LINUX系统是根据什么内容来确定这个文件是什么类型的呢???

问题三:我知道,在LINUX下要知道一个文件是什么类型,使用终端命令file可以进行判断,但我目的不在于此,我是想问有没有更直观的方法可以更快的判断这个文件属于什么类型!

盼指教:谢谢!
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: LINUX是如何识别文件类型的?

#2

帖子 自由建客 » 2015-11-05 20:22

文件头,魔数
头像
九天星
帖子: 1440
注册时间: 2007-07-14 20:45

Re: LINUX是如何识别文件类型的?

#3

帖子 九天星 » 2015-11-05 20:26

自由建客 写了:文件头,魔数

能说明白点吗?什么文件头?魔数是什么?
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: LINUX是如何识别文件类型的?

#4

帖子 自由建客 » 2015-11-05 20:53

九天星 写了:
自由建客 写了:文件头,魔数

能说明白点吗?什么文件头?魔数是什么?
通俗点就是,翻翻文件内容,凭经验判断。
头像
九天星
帖子: 1440
注册时间: 2007-07-14 20:45

Re: LINUX是如何识别文件类型的?

#5

帖子 九天星 » 2015-11-05 21:15

自由建客 写了:
九天星 写了:
自由建客 写了:文件头,魔数

能说明白点吗?什么文件头?魔数是什么?
通俗点就是,翻翻文件内容,凭经验判断。

这方法更复杂,还不如用file + 文件名 判断,而且还有局限性,并不是每个使用LINUX的人都会看代码啊
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: LINUX是如何识别文件类型的?

#6

帖子 自由建客 » 2015-11-05 21:58

九天星 写了:
自由建客 写了:
九天星 写了:
自由建客 写了:文件头,魔数

能说明白点吗?什么文件头?魔数是什么?
通俗点就是,翻翻文件内容,凭经验判断。

这方法更复杂,还不如用file + 文件名 判断,而且还有局限性,并不是每个使用LINUX的人都会看代码啊
我说的就是 file 命令的原理
头像
九天星
帖子: 1440
注册时间: 2007-07-14 20:45

Re: LINUX是如何识别文件类型的?

#7

帖子 九天星 » 2015-11-05 22:29

自由建客 写了:
九天星 写了:
自由建客 写了:
九天星 写了:
自由建客 写了:文件头,魔数

能说明白点吗?什么文件头?魔数是什么?
通俗点就是,翻翻文件内容,凭经验判断。

这方法更复杂,还不如用file + 文件名 判断,而且还有局限性,并不是每个使用LINUX的人都会看代码啊
我说的就是 file 命令的原理

还有别的方法吗?
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: LINUX是如何识别文件类型的?

#8

帖子 自由建客 » 2015-11-05 23:15

九天星 写了:还有别的方法吗?
头像
vickycq
帖子: 4507
注册时间: 2011-03-20 13:12
系统: Debian
来自: 山东省寿光县
联系:

Re: LINUX是如何识别文件类型的?

#9

帖子 vickycq » 2015-11-05 23:18

在下载一个视频文件之后,文件名自已变了,变成一些字母和数字,没有类似于WINDOWS下的扩展名,但图标还是显示的是视频文件,也能正常打开
这个是文件管理器的功能。判断的机制一部分硬编码在文件管理器中,另一部分规则位于 /usr/share/mime/packages/freedesktop.org.xml 中。
这个应该是 Freedesktop 标准的一部分。
打开查看,可见有的按扩展名判断。有的按文件头,魔数判断。

比如可执行二进制文件的判断规则:

代码: 全选

    <magic priority="40">
      <match value="\177ELF" type="string" offset="0">
        <match value="1" type="byte" offset="5">
          <match value="2" type="little16" offset="16"/>
        </match>
      </match>
      <match value="\177ELF" type="string" offset="0">
        <match value="2" type="byte" offset="5">
          <match value="2" type="big16" offset="16"/>
        </match>
      </match>
      <match value="MZ" type="string" offset="0"/>
      <match value="0x521c" type="little16" offset="0"/>
      <match value="0420" type="host16" offset="0"/>
      <match value="0421" type="host16" offset="0"/>
      <match value="0603" type="little16" offset="0"/>
    </magic>
比如 python 源代码的判断规则:

代码: 全选

    <magic priority="50">
      <match value="#!/bin/python" type="string" offset="0"/>
      <match value="#! /bin/python" type="string" offset="0"/>
      <match value='eval \"exec /bin/python' type="string" offset="0"/>
      <match value="#!/usr/bin/python" type="string" offset="0"/>
      <match value="#! /usr/bin/python" type="string" offset="0"/>
      <match value='eval \"exec /usr/bin/python' type="string" offset="0"/>
      <match value="#!/usr/local/bin/python" type="string" offset="0"/>
      <match value="#! /usr/local/bin/python" type="string" offset="0"/>
      <match value='eval \"exec /usr/local/bin/python' type="string" offset="0"/>
      <match value='/bin/env python' type="string" offset="2:16"/>
    </magic>
    <glob pattern="*.py"/>
    <glob pattern="*.pyx"/>
    <glob pattern="*.wsgi"/>
问题三:我知道,在LINUX下要知道一个文件是什么类型,使用终端命令file可以进行判断,但我目的不在于此,我是想问有没有更直观的方法可以更快的判断这个文件属于什么类型!
这个问题表述不清。是用肉眼看出,还是在程序中判断。或者说明你的应用场景。
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户
回复