Почему
file --extension
у меня не работает?
Не только для тебя. Смотрите этот вопрос . Один из комментариев там кажется правильным:
Может быть, просто очень, очень неполная функция?
Я не нашел ни одного стандартного инструмента Unix для конвертации, так что в любом случае ваша идея может быть самым простым решением.
Идея состоит в том, чтобы использовать,
file --mime-type
а затем создать массив таблицы диспетчеризации, который отображает известные mime-типы на их расширения, но я бы предпочел иметь более простое и безопасное решение.
Обратите внимание, что такая карта существует /etc/mime.types
. Посмотрите этот другой вопрос по Unix & Linux SE . На основе одного из ответов я придумал следующую функцию:
function getext() { [ "$#" != 1 ] && { echo "Wrong number of arguments. Provide exactly one." >&2; return 254; } [ -r "$1" ] || { echo "Not a file, nonexistent or unreadable." >&2; return 1; } grep "^$(file -b --mime-type "$1")"$'\t' /etc/mime.types | awk -F '\t+' '' }
Использование:
getext test_text_file.txt # it takes just one argument
Приспособьте это к своим потребностям, сделайте это сценарием и т. Д. Основные проблемы:
- В случае успеха (состояние выхода
0
), вывод может быть не пустым или не пустым (даже не\n
). - Некоторые mime-типы возвращают более одного расширения. Вы можете использовать,
cut -d ' ' -f 1
чтобы получить максимум один, но это может быть не тот, который вы хотите. Так что пользовательский файл карты вместо
/etc/mime.types
может быть полезен. Эта команда покажет вам, какие MIME-типы существуют в текущем каталоге (и подкаталогах):find . -type f -exec file -b --mime-type {} + | sort | uniq
grep
не должен совпадать более одного раза (хотя бы с/etc/mime.types
);^
(начало строки) и$'\t'
(вкладка), чтобы избежать частичного совпадения. Используйтеgrep -m 1 ...
(илиhead -n 1
позже), чтобы убедиться, что вы получите не более одной строки.