有人的地方,就有江湖。人常常是最难揣测的。假如有一面神奇的魔镜能看出一个人的内心,世界会不会显得愈发美好呢?Linux的世界里,file就是这样一面魔镜,它可以看见每位文件的内心。file命令可以辨识出文件的类型和编码格式,这是其他命令所做不到的。
查看文件类型
开门见山,我们直接用file这面魔镜来瞧瞧文件的“内心”。
#不加任何选项, 直接查看poetry文件 [roc@roclinux ~]$ file poetry.txt poetry.txt: ASCII text
使用不带任何选项的file命令,即可查看指定文件的类型信息。在前面的事例中可以看出poetry.txt的文件类型为text,编码格式为ASCII。
#使用-b选项来查看poetry文件 [roc@roclinux ~]$ file -b poetry.txt ASCII text
里面的事例中,我们使用了-b选项,可以使file命令的输出不出现文件名,只显示文件格式以及编码。
#使用-i选项来查看poetry文件 [roc@roclinux ~]$ file -i poetry.txt poetry.txt: text/plain; charset=us-ascii
里面的事例中,我们使用了-i选项,可以输出文件的MIME类型字符串。
小科普,MIME类型,即MultipurposeInternetMailExtensions,称为多用途互联网电邮扩充类型linux 查找文件类型,拿来标示和记录文件的打开方法,一些常见的类型包括:
设置输出分隔符
从前面的事例可以看出,file命令的输出格式是:
文件名:文件类型和编码格式
假如希望将中间的分隔符由逗号(:)改成其他符号,则可以使用-F选项来实现。
[roc@roclinux ~]$ file poetry.txt poetry.txt: ASCII text [roc@roclinux ~]$ file -F "=>" poetry.txt poetry.txt=> ASCII text
有些同学会问,这样的功能有何意义呢?在一些手动化文件剖析的脚本中,开发者为了防止分隔符和普通字符重复而导致误解析的情况,一般是会手工调整间隔符的。
查看软链接文件
file命令能查看所有文件的类型信息,这么问题来了,对于一个软链接文件,file命令是返回软链接文件本身的类型信息,还是返回软链接所指向的目标文件的类型信息呢?让我们通过试验得出推论吧:
#新建一个软链接文件 [roc@roclinux ~]$ ln -s poetry.txt poetry_s.txt #通过file命令查看软链接文件 [roc@roclinux ~]$ file poetry_s.txt poetry_s.txt: symbolic link to `poetry.txt' #使用-L选项来查看软链接文件 [roc@roclinux ~]$ file -L poetry_s.txt poetry_s.txt: ASCII text
试验是找到真相的最好方式。通过前面的示例,我们早已很清楚地看见了:
根据清单去工作
假如我们须要用file命令查看大量文件的类型信息,正好那些文件的名称都被储存在了一个文本文件中,这么-f选项就派上用场了。我们可以通过-f选项来指定这个文本文件,file命令都会乖乖地去挨个查看每一个文件的类型信息,示例如下:
#文件中含有三个待查文件, 我们故意设置了一个不存在的文件, 位于最后一个 [roc@roclinux ~]$ cat poetry_list.txt /root/book/poetry.txt /root/book/poetry_s.txt Nothing.txt #使用-f选项执行file命令 [roc@roclinux ~]$ file -f poetry_list.txt /root/book/poetry.txt: ASCII text /root/book/poetry_s.txt: symbolic link to `poetry.txt' Nothing.txt: ERROR: cannot open `Nothing.txt ' (No such file or directory)
在前面的事例中,poetry_list.txt包含了3行内容:
从结果可以看出,前两个如期输出了类型信息,最后一个也如期报了错误。
-z选项,想说爱你不容易
一次碰巧的机会,我在manfile中发觉了-z选项,原文解释是“Trytolookinsidecompressedfiles”,看来file还可以查看压缩文件内部的文件。那为何要用“Tryto”这样的字样呢,为了弄明白这个细节,于是,我的试验开始了。
第一轮试验开始,我们先来试验“一个未经压缩的tar包”:
#制作一个未经压缩的tar包 [roc@roclinux ~]$ tar -cvf poetry.tar poetry.txt poetry_s.txt poetry.txt poetry_s.txt #尝试使用-z选项 [roc@roclinux ~]$ file -z poetry.tar poetry.tar: POSIX tar archive (GNU)
其实并不尽如人意,file只是看出poetry.tar是一个tar包,并没有深入到tar包内部,第一轮试验宣告失败。
马上步入第二轮试验,我们瞧瞧一个经过gzip压缩过的tar包情况怎样?
#制作一个tar.gz包 [roc@roclinux ~]$ tar -czvf poetry.tar.gz poetry.txt poetry_s.txt poetry.txt poetry_s.txt #使用-z选项查看 [roc@roclinux ~]$ file -z poetry.tar.gz poetry.tar.gz: POSIX tar archive (GNU) (gzip compressed data, from Unix, last modified: Tue Mar 1 17:43:59 2016)
输出的信息稍为丰富了一些,但还是逗留在tar包的文件类型的层面,始终没有窥视到上面的poetry.txt和poetry_s.txt文件。第二轮试验也宣告失败。
那bzip2压缩的tar包是否OK呢?我们又赶紧步入了第四轮试验。
#制作一个.tar.bz2文件 [roc@roclinux ~]$ tar -cjvf poetry.tar.bz2 poetry.txt poetry_s.txt poetry.txt poetry_s.txt #使用-z选项查看 [roc@roclinux ~]$ file -z poetry.tar.bz2 poetry.tar.bz2: POSIX tar archive (GNU) (bzip2 compressed data, block size = 900k)
如你所见,第四轮试验一直是失败的。我早已开始怀疑人生了。信念让我坚持,不能服输。哈哈,就这样,我们再度踏上征程。我怀疑file只能窥视到单个文件压缩的情况,于是linux 查找文件类型,第三轮试验开始了。
#制作一个只包含1个文件的bz2文件 [roc@roclinux ~]$ bzip2 -c poetry.txt > poetry.bz2 #使用-z选项查看 [roc@roclinux ~]$ file -z poetry.bz2 poetry.bz2: ASCII text (bzip2 compressed data, block size = 900k)
结果仍然让我沮丧,这究竟是要闹哪样啊?到了这步田地,也就剩下单个gzip压缩文件的情况没有尝试了,我再碰碰运气吧,假如-z选项还是不能如愿地显示压缩文件包含文件的类型信息,我就准备给file的作者写电邮投诉了。于是,第五轮试验开始了。
#制作一个仅包含1个文件的gz文件 [roc@roclinux ~]$ gzip -c poetry.txt > poetry.gz #尝试用-z选项查看, 竟然查出结果了, 看到了ASCII text字样 [roc@roclinux ~]$ file -z poetry.gz poetry.gz: ASCII text (gzip compressed data, was "poetry.txt", from Unix, last modified: Tue Mar 1 19:01:22 2016) #再试试没有-z选项的情况, 确实没有探测出ASCII text类型 [roc@roclinux ~]$ file poetry.gz poetry.gz: gzip compressed data, was "poetry.txt", from Unix, last modified: Tue Mar 1 19:01:22 2016
总算,总算,我们总算成功了linux系统装win7,我们通过试验找到了答案。
直至这步我们才晓得,man中-z选项的解释似乎是“Trytolookinsidecompressedfiles”,但似乎只支持对gzip包内部文件的探寻,而对于tar、tar.gz、tar.bz2和bz2包全部都不支持。
大胆猜想linux压缩命令,file的作者可能是慑于开发时间的压力,仅仅支持了gzip的情况,而且又不希望未来仅支持这一种压缩类型,因而写上“Tryto”,为日后的扩充留下了可能性。
最后,我要和file的作者说句话,你这样使用“Tryto”和用户捉迷藏,之后就能一起愉快地打闹么?