Я планирую загрузить кучу изображений с веб-сайта, которые не имеют расширения, поэтому я хочу добавить его в зависимости от содержимого файла или mime-типа.

file <filename> отлично справляется с определением типа файла , однако мне нужно расширение.

--extension
      Print a slash-separated list of valid extensions for the file type found.

Это из file страницы файла , но она не работает:

$ file --extension test_text_file.txt
test_text_file.txt: ???

$ file --extension test_png_file.png
test_png_file.png: ???

$ file --extension test_gif_file.gif
test_gif_file.gif: ???

Это буквально печатает ??? для каждого файла, который я передаю, даже те, которые уже имеют правильное расширение. Все они являются действительными файлами своего типа и отлично распознаются по file без --extension .

Почему file --extension не работает для меня и что я могу использовать, чтобы получить расширение файла?

Идея состоит в том, чтобы использовать file --mime-type а затем создать массив таблицы диспетчеризации, который отображает известные mime-типы на их расширения, но я бы предпочел иметь более простое и безопасное решение.

1 ответ1

1

Почему 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+' '{print $2}'
}

Использование:

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 позже), чтобы быть уверенным, что вы получите не более одной строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .