Как я могу определить стандартное расширение файла файла

Я наткнулся на проект, названный экранной сессией. Это позволяет Вам сохранять и перезагружать Экранные сессии GNU в некоторой степени.

6
27.11.2013, 01:36
3 ответа

Расширения файла, зарегистрированные в Вашей системе, должны быть в /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
5
27.01.2020, 20:24
  • 1
    grep | awk может обычно делаться с помощью awk один. –  200_success 26.11.2013, 19:33
  • 2
    @200_success см. отредактированный ответ. –  Joseph R. 26.11.2013, 19:36
  • 3
    @200_success да, но это - не всегда хорошая идея с тех пор grep будет иметь тенденцию быть быстрее, чем awk это должно проверить regex на каждую строку. –  terdon♦ 27.11.2013, 02:40

Это - та же основная идея как ответ @hildred, но использование более простого подхода (gawk) и измененный для контакта с именами файлов, содержащими пробелы и неизвестные типы файлов.

Добавьте эти строки к файлу инициализации своей оболочки (~/.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
27.01.2020, 20:24

подтверждение концепции, не обрабатывает забавные символы, предполагает, что первое расширение является правильным.

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

Теги

Похожие вопросы