如何通过文件扩展名获取对应MIME类型?gawk脚本问题求助
问题描述
需要编写脚本,输入文件扩展名(如opus)时输出对应MIME类型(如audio/ogg),用于查询系统中不存在的文件(例如远程文件)。尝试用gawk处理/etc/mime.types但操作困难,希望优化gawk方案或找到合适的GNU/Linux工具。
现有脚本:
#!/usr/bin/env bash awk -F' ' '$0 ~ /'${1}'/' /etc/mime.types
使用方式:./extension2mime opus
遇到两个问题:
- 无法设置制表符为字段分隔符(
/etc/mime.types中MIME类型与扩展名用制表符分隔); - 希望匹配除第一列外的所有列,匹配后仅输出第一列(MIME类型列)。
补充:运行./extension2mime opus期望输出audio/ogg,附/etc/mime.types片段:
audio/mpeg mp3 mpga mp1 mp2 audio/mpeg4-generic audio/ogg oga ogg opus spx audio/opus audio/parityfec audio/PCMA
解决方案
优化后的gawk脚本
针对需求调整awk逻辑即可解决问题,同时避免字符串拼接的安全风险:
#!/usr/bin/env bash awk -v ext="$1" ' BEGIN { FS = "[[:space:]]+" } { for (i=2; i<=NF; i++) { if ($i == ext) { print $1 next } } } ' /etc/mime.types
关键说明:
-v ext="$1":将脚本输入参数传递给awk变量ext,避免直接拼接正则的安全问题;FS = "[[:space:]]+":设置字段分隔符为任意数量的空白字符(制表符、空格均适用),完美适配/etc/mime.types的格式;- 循环遍历第二列及以后的所有字段,精确匹配输入的扩展名,匹配成功后立即输出第一列(MIME类型)并跳过当前行剩余处理,避免重复输出。
替代工具方案
如果不想用awk,也可以用grep配合cut实现(可靠性稍逊,但更简洁):
grep -w "$1" /etc/mime.types | cut -d' ' -f1
-w:确保匹配整词,避免部分匹配(比如输入ogg不会误匹配ogga);cut -d' ' -f1:提取匹配行的第一列。
注意:file、xdg-mime等工具需要目标文件存在,因此不适合查询远程/不存在的文件,awk脚本仍是最适配需求的方案。
内容的提问来源于stack exchange,提问作者alexandre1985
相关产品推荐
相关产品推荐

