file命令

file 命令 #

file命令用于确定文件的类型。它通过检查文件的内容、魔数(magic numbers)、文件头和其他特征来识别文件类型,而不仅仅依赖于文件扩展名。这在Linux系统中特别有用,因为Linux不像Windows那样严格依赖文件扩展名来确定文件类型。

语法 #

file [选项] [文件...]

常用选项 #

选项 描述
-b, --brief 简洁模式,不显示文件名
-i, --mime 输出MIME类型字符串
-I 输出MIME类型字符串(旧式选项)
-k, --keep-going 不在第一个匹配后停止,继续查找
-l, --list 列出支持的魔数
-L, --dereference 跟随符号链接
-h, --no-dereference 不跟随符号链接(默认)
-n, --no-buffer 不对输出进行缓冲
-N, --no-pad 不填充输出
-p, --preserve-date 保留访问时间
-r, --raw 原始输出,不进行翻译
-s, --special-files 也读取块设备和字符设备的内容
-z, --uncompress 尝试查看压缩文件的内容
-Z, --uncompress-noreport 尝试查看压缩文件的内容,但不报告压缩状态
-0, --print0 用空字符而不是换行符终止输出行
-C, --compile 编译魔数文件
-m, --magic-file 文件 使用指定的魔数文件
--mime-type 只输出MIME类型部分
--mime-encoding 只输出MIME编码部分
--extension 输出适合的文件扩展名
-v, --version 显示版本信息
-h, --help 显示帮助信息

常见用法 #

1. 确定单个文件的类型 #

file document.txt

输出示例:

document.txt: ASCII text

2. 确定多个文件的类型 #

file document.txt image.jpg script.sh

输出示例:

document.txt: ASCII text
image.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 800x600, components 3
script.sh: Bourne-Again shell script, ASCII text executable

3. 简洁模式(不显示文件名) #

file -b document.txt

输出示例:

ASCII text

4. 显示MIME类型 #

file --mime document.txt

输出示例:

document.txt: text/plain; charset=us-ascii

5. 只显示MIME类型部分 #

file --mime-type document.txt

输出示例:

document.txt: text/plain

6. 只显示MIME编码部分 #

file --mime-encoding document.txt

输出示例:

document.txt: us-ascii

7. 跟随符号链接 #

file -L symlink.txt

这将显示符号链接指向的文件的类型,而不是链接本身。

8. 查看压缩文件的内容 #

file -z compressed.gz

这将尝试查看压缩文件的内容并确定其类型。

实用示例 #

1. 递归检查目录中所有文件的类型 #

find /path/to/directory -type f -exec file {} \;

2. 查找所有文本文件 #

find /path/to/directory -type f -exec file {} \; | grep "text"

3. 检查二进制文件的架构 #

file /bin/bash

输出示例:

/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=12345, stripped

4. 检查图像文件的详细信息 #

file image.jpg

输出示例:

image.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 800x600, components 3

5. 检查视频文件的格式 #

file video.mp4

输出示例:

video.mp4: ISO Media, MP4 Base Media v1 [IS0 14496-12:2003]

6. 检查音频文件的格式 #

file audio.mp3

输出示例:

audio.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, JntStereo

7. 检查PDF文件的版本 #

file document.pdf

输出示例:

document.pdf: PDF document, version 1.5

8. 检查压缩文件的类型 #

file archive.tar.gz

输出示例:

archive.tar.gz: gzip compressed data, was "archive.tar", last modified: Wed Jul 19 10:30:00 2023, from Unix, original size 10240

9. 检查脚本文件的类型和编码 #

file --mime script.py

输出示例:

script.py: text/x-python; charset=utf-8

10. 检查未知文件的类型 #

file unknown_file

这对于没有扩展名或扩展名不正确的文件特别有用。

高级用法 #

1. 使用自定义魔数文件 #

file -m /path/to/custom/magic/file document.txt

这允许使用自定义的魔数规则来识别文件类型。

2. 列出支持的魔数 #

file -l

这将列出file命令支持的所有魔数规则。

3. 保留访问时间 #

file -p document.txt

这将在检查文件类型后保留文件的访问时间。

4. 获取适合的文件扩展名 #

file --extension document

这将输出适合该文件类型的文件扩展名。

5. 在脚本中使用file命令 #

filetype=$(file -b --mime-type document)
if [ "$filetype" = "text/plain" ]; then
    echo "这是一个文本文件"
fi

6. 检查二进制文件是否被剥离了调试符号 #

file /bin/ls | grep -q "stripped"
if [ $? -eq 0 ]; then
    echo "二进制文件已被剥离调试符号"
fi

文件类型示例 #

以下是一些常见文件类型的file命令输出示例:

文件类型 示例输出
文本文件 ASCII textUTF-8 Unicode text
Shell脚本 Bourne-Again shell script, ASCII text executable
Python脚本 Python script, ASCII text executable
C源代码 C source, ASCII text
ELF可执行文件 ELF 64-bit LSB shared object, x86-64, version 1 (SYSV)
JPEG图像 JPEG image data, JFIF standard 1.01
PNG图像 PNG image data, 800 x 600, 8-bit/color RGB, non-interlaced
GIF图像 GIF image data, version 89a, 800 x 600
PDF文档 PDF document, version 1.5
ZIP归档 Zip archive data, at least v2.0 to extract
Gzip压缩 gzip compressed data, was "file", last modified: date, from Unix
HTML文件 HTML document, ASCII text
XML文件 XML document text
空文件 empty
目录 directory
符号链接 symbolic link to file
字符设备 character special
块设备 block special

与其他命令的比较 #

命令 功能 区别
file 确定文件类型 基于文件内容和魔数
mimetype 确定MIME类型 专注于MIME类型,可能更依赖扩展名
stat 显示文件状态 显示元数据,不确定内容类型
ls -l 列出文件信息 只显示基本文件类型(常规、目录、链接等)
identify 识别图像文件 专用于图像文件,提供更详细的图像信息

提示 #

  • file命令是识别未知文件类型的强大工具,特别是当文件没有扩展名或扩展名不正确时
  • 使用--mime-type选项可以获取标准化的MIME类型,便于在脚本中处理
  • 对于符号链接,默认显示链接本身的信息,使用-L选项可以显示链接目标的信息
  • file命令可以识别许多压缩和归档格式,使用-z选项可以查看压缩文件的内容
  • 在处理大量文件时,可以结合find命令使用file来批量识别文件类型
  • 使用-b选项可以获得更简洁的输出,便于在脚本中处理
  • file命令的输出可能因系统和版本而略有不同
  • 对于某些特殊文件类型,可能需要安装额外的魔数文件或更新现有的魔数文件