Определение типов файлов

LinuxBeginner
Практиковаться сейчас

Введение

В Windows и macOS вы привыкли к тому, что расширение файла сообщает, что это за файл. Если имя заканчивается на .jpg, это изображение. Если на .exe — программа.

В Linux имя файла — это всего лишь метка. И, как и в реальной жизни, метка может быть неверной. Можно взять банку с солью и написать на этикетке «Сахар», но содержимое всё равно останется солёным.

Linux не доверяет метке, то есть имени файла. Вместо этого система анализирует содержимое файла, чтобы определить, чем он является на самом деле.

Это отражает более широкую идею Unix: смысл часто определяется тем, как данные устроены и используются, а не только их именем. Расширения могут быть удобной подсказкой для человека, но не являются окончательным источником истины.

В этой лабораторной работе вы используете команду file, чтобы определить истинный тип файлов независимо от их имён.

Этот навык важен в реальной работе по эксплуатации систем. Вам могут встретиться скачанные файлы, журналы, дампы, скрипты или подозрительные вложения с вводящими в заблуждение именами. Прежде чем открывать, запускать или редактировать такие файлы, разумно сначала определить, чем они являются на самом деле.

Проверка текстового файла

Начнём с файла, который действительно соответствует своему имени.

Сначала перейдите в каталог проекта:

cd ~/project
ls -l

Вы увидите файл welcome.txt. Расширение .txt предполагает, что это текстовый файл. Но помните: мы не доверяем одним только меткам.

Попросите команду file проверить этот файл:

file welcome.txt

Вы увидите примерно такой результат:

welcome.txt: ASCII text

Команда file проверила содержимое и подтвердила: «Да, это текст в формате ASCII».

Такие команды, как cat, less и текстовые редакторы, лучше использовать, когда вы уже знаете, является ли файл текстовым. Команда file помогает безопасно принять это решение.

Значит, файл можно безопасно прочитать. Используйте, например, команду cat:

cat welcome.txt

Проверка двоичного файла

Системные программы, такие как ls, mkdir и cat, не являются текстовыми файлами. Это двоичные файлы, записанные на языке, который понимает только процессор компьютера.

Посмотрим на саму команду ls. Она находится в каталоге /bin.

Попросите команду file определить её тип:

file /bin/ls

Результат может выглядеть пугающе, но он содержит много полезной информации:

/bin/ls: ELF 64-bit LSB pie executable, x86-64, ...

Не пугайтесь. Вот расшифровка:

  • ELF — стандартный формат программ Linux, примерно как .exe в Windows.
  • executable — исполняемый файл, то есть программа, которую можно запустить.

ELF расшифровывается как Executable and Linkable Format — «исполняемый и компонуемый формат». Это стандартный двоичный формат, используемый многими системами Linux. Запоминать полное название не обязательно, но полезно узнавать ELF как обозначение «это исполняемый файл Linux».

Главный вывод: команда file сообщила, что это исполняемый файл. Если попробовать выполнить cat /bin/ls, экран заполнится непонятными символами. Если вы знаете, что файл двоичный, это предупреждает: «Не читайте этот файл как текст — запускайте его».

Определение типов неизвестных файлов

Теперь займёмся расследованием. В каталоге проекта находятся два подозрительных файла: mystery_file и fake_image.jpg.

Случай 1: Файл без имени

У файла mystery_file нет расширения. Это текстовый файл? Программа?

Проверим:

file mystery_file

Результат:

mystery_file: PNG image data, ...

Вот как! Это изображение PNG. Несмотря на отсутствие расширения, Linux распознал внутреннюю сигнатуру PNG-изображения.

Случай 2: Обманщик

Теперь проверим fake_image.jpg. Метка утверждает, что это «изображение JPEG». Но так ли это?

file fake_image.jpg

Результат:

fake_image.jpg: ASCII text

Это неправда! На самом деле перед нами обычный текстовый файл.

Поскольку мы знаем, что это текстовый файл, его можно безопасно прочитать:

cat fake_image.jpg

Именно этот навык — определять файл по его содержимому, а не по имени — отличает опытных пользователей Linux от начинающих.

Это также одна из причин, по которой Linux в меньшей степени зависит от расширений, чем некоторые настольные операционные системы. Расширения — полезное соглашение, но система часто может получить больше информации, непосредственно проверив файл.

Итоги

Вы научились не ограничиваться меткой и определять истинный тип файла.

  • file filename — команда, которая помогает раскрыть правду о файле.
  • Расширения могут вводить в заблуждение: .jpg не всегда означает изображение.
  • Нет расширения? Это не проблема: Linux не нужны расширения, чтобы определить тип файла.

Теперь вы готовы работать с любым неизвестным файлом, который встретится вам на практике!