file命令通过文件头识别真实类型,stat命令通过atime/mtime/ctime反映内核记录的时间事件,二者互补:file揭示“是什么”,stat揭示“经历过什么”。

Linux 下用 file 和 stat 配合,能准确识别文件“真正是什么”以及“它经历过什么时间事件”。file 看内容本质,stat 看元数据变迁——两者不替代,而是互补。
用 file 命令穿透表象,识别真实媒体类型
ls -l 或后缀名(如 .jpg)可能骗人。file 通过读取文件头(magic bytes)判断实际格式:
-
基本用法:`file document.pdf` → 输出类似 PDF document, version 1.7;哪怕文件被重命名为
document.txt,结果也不变 - 查 MIME 类型(脚本友好):`file -i image.png` → 输出 image.png: image/png; charset=binary
-
强制深度检测(防伪装):`file -k script.sh`,加
-k会继续扫描后续字节,避免仅靠开头误判 - 批量检查:`file * | grep "HTML\|JPEG\|ELF"` 快速筛选出网页、图片或可执行文件
用 stat 命令看清三个不可伪造的时间戳含义
stat 显示的 atime/mtime/ctime 是内核维护的真实记录,不受用户主观命名影响。关键在理解它们触发条件:
-
atime(访问时间):文件内容被读取时更新 ——
cat data.log、python3 script.py(执行)、ffmpeg -i video.mp4 -vframes 1 thumb.jpg(解码读取)都会动它 -
mtime(修改时间):文件内容字节变化时更新 ——
echo "new" >> file、vim :wq、gzip file.txt(原文件被覆盖) -
ctime(状态变更时间):只要 inode 被改就更新 —— 包括
chmod 600 file、chown user file、mv old new,甚至mtime变更时 ctime 也必然同步更新
组合使用:验证媒体文件是否被篡改或重打包
比如一个声称是原始照片的 photo.jpg,怀疑被编辑过:
- 先用
file photo.jpg确认确实是 JPEG,不是伪装成 JPG 的 PNG(输出含 data 或 PNG image data 就露馅) - 再运行
stat -c "%n: mtime=%y, ctime=%z" photo.jpg—— 若 mtime 比 ctime 新,说明内容被改过但权限没动;若 ctime 明显晚于 mtime 且无 chmod/mv 记录,可能是用工具批量重写元数据 - 对比同批照片:`stat -c "%n %y" *.jpg | sort` 查看 mtime 是否集中在一个异常时间点(如批量导出或转换)
注意 birth time(创建时间)的可用性与局限
ext4/xfs 等现代文件系统支持 btime,但它不是所有环境都开启或显示:
- 查看命令:
stat -c "%w" photo.jpg(若输出为 -,说明文件系统不支持或未启用) - btime 不等于“文件第一次出现在当前路径”,而是 inode 第一次被分配的时间 —— 移动(mv)不改变 btime,但 cp 会产生新 inode 和新 btime
- 不要依赖 btime 做法律证据,因它易受系统时间回拨、镜像恢复等影响;mtime+ctime 组合反而更稳定可信


















