Como posso determinar a extensão de nome de arquivo convencional de um arquivo?

6

O comando file é bom para determinar os tipos de arquivo para minhas necessidades. Existe alguma maneira de mapear esses resultados para extensões de nome de arquivo convencional?

    
por Sean W. 26.11.2013 / 15:07

3 respostas

5

As extensões de arquivo registradas em seu sistema devem estar em /etc/mime.types . Então, supondo que você tenha conseguido extrair o tipo de arquivo da saída de file para uma variável chamada type , você pode simplesmente:

grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'

ou (como sugerido por 200_success nos comentários), você pode usar awk sozinho:

awk -v IGNORECASE=1 '/ENVIRON["type"]/{$1="";print $0}'

Exemplo

$ type=Perl
$ grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'
 pl pm
    
por 26.11.2013 / 15:44
3

Esta é a mesma ideia básica da resposta do @hildred, mas usando uma abordagem mais simples ( gawk ) e modificado para lidar com nomes de arquivos contendo espaços e tipos de arquivos desconhecidos.

Adicione estas linhas ao arquivo de inicialização do seu shell ( ~/.bashrc , por exemplo, se você estiver executando 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    
}

Agora você pode executá-lo assim:

$ 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

Ele retornará 'extensão desconhecida' para arquivos sem extensão associada em /etc/mime.types , como cp , que é um executável.

    
por 26.11.2013 / 18:13
2

prova de conceito, não lida com personagens engraçados, assume que a primeira extensão está certa.

file --mime-type -N *|sed \
   -e 's!^\(.*: \)\(.*\)$!echo ;grep -e  /etc/mime.types!e' \
   -e 's!\n.*/[^     ]\+[    ]\+\([^ ]\+\).*! !' \
   -e 's!\n\(.*/[^     ]\)\+!!'
    
por 26.11.2013 / 16:55