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

如何通过文件扩展名获取对应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

遇到两个问题:

  1. 无法设置制表符为字段分隔符(/etc/mime.types中MIME类型与扩展名用制表符分隔);
  2. 希望匹配除第一列外的所有列,匹配后仅输出第一列(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:00:15