该file
命令擅长根据我的需要确定文件类型。有什么方法可以将这些结果映射到传统的文件扩展名吗?
答案1
在您的系统上注册的文件扩展名应该是/etc/mime.types
.因此,假设您设法将文件类型从 的输出提取file
到名为 的变量中type
,您可以简单地:
grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'
或者(如评论中 200_success 所建议的),您可以awk
单独使用:
awk -v IGNORECASE=1 '/ENVIRON["type"]/{$1="";print $0}'
例子
$ type=Perl
$ grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'
pl pm
答案2
这与@hildred 的基本想法相同回答但使用更简单的方法(gawk
)并进行修改以处理包含空格的文件名和未知文件类型。
将这些行添加到 shell 的初始化文件中(~/.bashrc
例如,如果您正在运行bash
):
get_ext(){
for f in "$@"; do
type='unknown extension';
foo=$(grep -w "$(file --mime-type "$f" | awk '{print $NF}')" /etc/mime.types |
awk -F"\t" 'NF>1{print $NF}')
[ -n "$foo" ] && type="$foo";
printf "%s\t%s\n" "$f" "$type";
done
}
您现在可以像这样运行它:
$ get_ext *
cp unknown extension
file with spaces .jpg jpeg jpg jpe
foo.pl pl pm
foo.png png
foo.py py
foo.txt asc txt text pot brf srt
/etc/mime.types
对于没有关联扩展名的文件(例如cp
可执行文件),它将返回“未知扩展名” 。
答案3
概念证明,不处理有趣的字符,假设第一个扩展是正确的。
file --mime-type -N *|sed \
-e 's!^\(.*: \)\(.*\)$!echo \1;grep -e \2 /etc/mime.types!e' \
-e 's!\n.*/[^ ]\+[ ]\+\([^ ]\+\).*! \1!' \
-e 's!\n\(.*/[^ ]\)\+!\1!'