Comment puis-je déterminer l'extension conventionnelle d'un file

La command de file est bonne pour déterminer les types de files pour mes besoins. Y at-il un moyen de mapper ces résultats aux extensions de nom de file classiques?

Les extensions de file enregistrées sur votre système doivent être dans /etc/mime.types . Donc, en supposant que vous avez réussi à extraire le type de file de la sortie du file dans une variable appelée type , vous pouvez simplement:

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

ou (comme suggéré par 200_success dans les commentaires), vous pouvez utiliser awk seul:

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

Exemple

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

C'est la même idée de base que la réponse de @hildred mais en utilisant une approche plus simple ( gawk ) et modifiée pour traiter les noms de files contenant des espaces et des types de files inconnus.

Ajoutez ces lignes au file d'initialisation de votre shell ( ~/.bashrc par exemple, si vous exécutez 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 } 

Vous pouvez maintenant l'exécuter comme ceci:

 $ 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 

Il renverra 'extension inconnue' pour les files qui n'ont pas d'extension associée dans /etc/mime.types comme cp qui est un exécutable.

preuve de concept, ne gère pas les personnages drôles, suppose que la première extension est correcte.

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