file命令获取文件类型有时候为空的问题

1863次阅读  |  发布于5年以前

这篇文章是记录遇到的一个问题,简单总结为:

file命令获取文件类型,如果该文件内容第一个字符为(,那么返回值为空。 该问题在4.17版本里出现,5.04版本里已经修复。中间的版本由于我没有这样的环境,所以无法测试。

想看具体的过程可以接着往下看。

问题描述

之前做的一个内部平台里涉及到把编译后的文件上线,上线脚本里有文件diff功能,也就是将有修改文件的diff显示出来让使用者确认。 对于像图片,swf之类的资源由于无法diff,所以即使有修改也直接跳过。 这里是通过获取文件类型来识别的,如果文件类型里不包含text字样,那么不进行diff。识别代码如下:

type=`file $svn_src_dir/$file | grep "text"`

今天有同学说部分js文件有修改,但没有显示diff。最后发现有些文件这里获取到的type是false.

file命令

NAME file - determine file type

SYNOPSIS file [ -bchikLnNprsvz ] [ -f namefile ] [ -F separator ] [ -m magicfiles ] file ... file -C [ -m magicfile ]

DESCRIPTION This manual page documents version 4.17 of the file command.

问题分析

分析这些文件,发现这些文件都使用js闭包,文件内容大致都是这样的:

(function(){
        //逻辑代码
    })()

逐步排查发现,如果文件内容第一个字符为(,那么不管后面的内容是啥,在4.17版本下返回值都为空。 但在5.04版本下是ok的。

解决办法

file命令提供了-i参数,获取文件的mime-type。一般文本文件的mime-type为text/plain。那么就可以通过获取文件的mime-type来解决。

type=`file -i $svn_src_dir/$file | grep "text"`

当然升级版本才是最好的解决办法。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8