如何在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
但我不想创建文件,试了两种方式都不行:
file <(echo 'bar'),结果是/dev/fd/63: symbolic link to pipe:[1452271]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
相关产品推荐
相关产品推荐

