如何确定文件的常规文件扩展名

如何确定文件的常规文件扩展名

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!'

相关内容