我正在尝试制作一个给定文件扩展名(例如“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
编辑:
./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
.
一个简单的方法如下:
#!/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
我正在尝试制作一个给定文件扩展名(例如“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
中提取第一个元素作为不需要的编码(第二个元素)。