You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在sh Shell中无需创建文件,通过字符串变量获取文件类型与扩展名?

问题:不创建文件,如何检测字符串内容对应的文件类型/扩展名?

我想在sh Shell里根据字符串变量的内容检测合适的文件扩展名,尝试用file命令。创建文件后执行以下命令能得到有效结果:

echo "bar" > foo.txt
file foo.txt
file --mime-type foo.txt

输出:

foo.txt: ASCII text
foo.txt: text/plain

但我不想创建文件,试了两种方式都不行:

  1. file <(echo 'bar'),结果是/dev/fd/63: symbolic link to pipe:[1452271]
  2. echo 'bar' | file,得到file命令的帮助信息

请问能不能用file命令实现不创建文件就得到上述结果?或者有其他替代工具?


回答

当然可以用file命令实现,只需要调整参数用法:

方法1:通过管道配合-参数

file命令支持用-作为文件名来读取**标准输入(stdin)**的内容,这样就能直接分析字符串内容而不用创建文件:

# 检测文件类型
echo 'bar' | file -
# 输出:standard input: ASCII text

# 检测MIME类型
echo 'bar' | file --mime-type -
# 输出:text/plain

如果不想显示standard input:前缀,可以加-b(简洁输出)参数:

echo 'bar' | file -b -
# 输出:ASCII text

echo 'bar' | file -b --mime-type -
# 输出:text/plain

方法2:结合进程替换(Process Substitution)

如果想用进程替换的方式,需要让file强制分析文件内容而非文件本身的属性。加上--mime-type(或缩写-i)参数即可:

file --mime-type <(echo 'bar')
# 输出:/dev/fd/63: text/plain

# 同样可以加-b去掉前缀
file -b --mime-type <(echo 'bar')
# 输出:text/plain

之前你得到符号链接的结果,是因为file默认会先识别文件的系统属性(比如管道/符号链接),加上--mime-type后会跳过这一步,直接分析内容的MIME类型。

替代工具

如果需要更专注于字符编码或MIME类型检测,也可以用这些工具:

  • chardet:专门检测字符编码,安装后直接通过管道使用:echo 'bar' | chardet,输出类似stdin: ascii with confidence 1.0
  • libmagic相关脚本:file本身基于libmagic实现,若需自定义检测逻辑,可直接调用libmagic的API编写脚本。

内容的提问来源于stack exchange,提问作者Jimmix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:20:16