获取mime类型的文件扩展名

问题描述 投票:0回答:2

我正在尝试制作一个给定文件扩展名(例如“opus”)的脚本,它会打印相应的 mime 类型(“audio/opus”)。 这样我就可以找到给定系统中不存在的文件(例如,远程文件)的 mime 类型。

我确实尝试在 /etc/mime.types 上使用 gawk,但我是 gawk 的初学者,尝试破解它对我来说很难。

但我知道 gawk 是这项工作的最佳解决方案。否则,我想要一个已经可以做到这一点的 GNU/Linux 工具。

这就是我所拥有的:

#!/usr/bin/env bash

awk -F' ' '$0 ~ /'${1}'/' /etc/mime.types

它被用作

./extension2mime opus

  1. 我在将字段分隔符设置为制表符时遇到困难(因为我相信制表符在 /etc/mime.types 中用于 mime 类型和文件扩展部分之间)。
  2. 我想匹配除第一列以外的所有列。并且只打印匹配项的第一列(正是我忽略的列)。当然,这是在 /etc/mime.types 文件上完成的。

编辑:

./extension2mime opus
的结果将是
audio/ogg
。如果你能让它回归,那就加分
audio/opus
(但似乎不可能)。

这里是 /etc/mime.types 的摘录

audio/mpeg                                      mp3 mpga mp1 mp2
audio/mpeg4-generic
audio/ogg                                       oga ogg opus spx
audio/opus
audio/parityfec
audio/PCMA

编辑2:

我不想再返回

audio/opus
而不是
audio/ogg
。没有可行的方法让
opus
返回
audio/opus
,以及
mp4
返回
video/mp4
.

bash awk mime-types gnu
2个回答
2
投票

一个简单的方法如下:

#!/bin/sh
awk -v ext="$1" '            # pass shell variable to awk
/^#/{next}                   # skip comment lines
{type=$1;$1=""}              # store and strip first field
$0~"\\<"ext"\\>"{print type} # print type of matching extensions
' /etc/mime.types

请注意,这会将您的参数解释为正则表达式,因此像

.
^
这样的输入将打印所有行。

\<...\>
正则表达式仅匹配完整扩展名,因此
jpg
不会匹配
jpg2
sjpg
(这是 GNU awk 的非 POSIX 扩展)。

或者命令式方法,将所有字段与你的指针进行循环比较:

awk -v ext="$1" '    # pass shell variable to awk
!/^#/{               # skip comment lines
  for(i=2;i<=NF;++i) # loop fields
    if ($i==ext)     # compare extensions
      print $1       # print type
}
' /etc/mime.types

0
投票

我正在尝试制作一个给定文件扩展名(例如“opus”)的脚本,它会打印相应的 mime 类型(“audio/opus”)(...)但我知道 gawk 是最好的解决方案为了这份工作。否则,我想要一个已经可以做到这一点的 GNU/Linux 工具。(...)

然后考虑使用

python
,它存在于许多 linux 发行版中,并且在标准库中具有该任务的功能,即
mimetypes.guess_type
,在命令行为每个参数输出可能类型的简单脚本可以编写如下, 让
guesser.py
成为

import mimetypes, sys
for i in sys.argv[1:]:
    print(mimetypes.guess_type(i)[0])

然后按照以下方式使用它

python guesser.py file file.mp3 file.ogg

给出输出

None
audio/mpeg
audio/ogg

None
表示未知,我从
sys.argv
中删除第一个元素,因为它包含脚本中的文件名,我从
mimetypes.guess_type
中提取第一个元素作为不需要的编码(第二个元素)。

© www.soinside.com 2019 - 2024. All rights reserved.