Расширения файла имеют какую-либо цель (для операционной системы)?

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

Это - то, что я помню от своего образования. Исправьте меня в случае, если я неправ!

Работая немного с системами Ubuntu недавно: Я вижу много файлов в системах, которые имеют расширения как .sh, .txt, .o, .c

Теперь я задаюсь вопросом: эти расширения, предназначены только для людей? Так, чтобы понял, какой файл это?

Или у них есть некоторая цель для операционной системы также?

83
задан 27 July 2016 в 08:22

7 ответов

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

Это то, что я помню из своего образования. Пожалуйста, поправьте меня, если я ошибаюсь!

  • правильно запомнил.

Эти расширения предназначены только для людей?

  • Да, с «но».

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

В Windows открывающее программное обеспечение прикреплено к расширениям .

Открыть текстовый файл с именем «файл» в Windows сложнее, чем открыть тот же файл с именем «file.txt» (вам нужно будет переключить диалоговое окно открытия файла с *. Txt на *. * каждый раз). То же самое касается текстовых файлов, разделенных TAB и точкой с запятой. То же самое касается импорта и экспорта электронной почты (расширение .mbox).

В частности, когда вы кодируете программное обеспечение. Открыть файл с именем «software1», представляющий собой HTML-файл, и «software2», являющийся файлом JavaScript, становится сложнее по сравнению с «software.html» и «software.js».


Если в Linux есть система там, где важны расширения файлов, я бы назвал это ошибкой. Когда программное обеспечение зависит от расширений файлов, это можно использовать. Мы используем директиву интерпретатора , чтобы определить, что представляет собой файл («первые два байта в файле могут быть символами« #! », Которые составляют магическое число (шестнадцатеричные 23 и 21, значения ASCII «#» и «!») часто называют shebang, «).

Самая известная проблема с расширениями файлов была LOVE-LETTER-FOR-YOU.TXT.vbs в Windows. Это визуальный базовый сценарий, отображаемый в файловом проводнике в виде текстового файла.

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

В командной строке, когда вы что-то выполняете, вы можете визуально увидеть, что это за расширение. Если он закончится на .vbs, я начну подозревать (не то, что .vbs исполняемый в Linux. По крайней мере, не без дополнительных усилий;)).

45
ответ дан 22 November 2019 в 23:16

Здесь нет 100% черного или белого ответа.

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

Например, все файлы растровых изображений (обычно с расширением имени .bmp ) должны начинаться с букв BM в первых двух байтах. Скрипты на большинстве языков сценариев, таких как Bash, Python, Perl, AWK и т. Д. (В основном все, что обрабатывает строки, начинающиеся с # как комментарии) могут содержать шебанг вроде #! / Bin / bash в качестве первой строки. Этот специальный комментарий сообщает системе, в каком приложении открыть файл.

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


Приложения, конечно, могут реализовывать свои проверки файлов по своему усмотрению, включая проверку имени и расширения файла. Примером может служить Eye of Gnome ( eog , стандартная программа просмотра изображений), которая определяет формат изображения по расширению файла и выдает ошибку, если оно не соответствует содержимому. Можно обсудить, является ли это ошибкой или функцией ...

Однако даже некоторые части операционной системы полагаются на расширения имен файлов, например при разборе исходных файлов программного обеспечения в /etc/apt/sources.list.d/ - анализируются только файлы с расширением *. list , все остальные игнорируются. Возможно, он в основном используется не для определения типа файла, а для включения / отключения анализа некоторых файлов, но это все же расширение файла, которое влияет на то, как система обрабатывает файл.

И, конечно же, пользователь-человек больше всего получает от файла extension, так как это делает тип файла очевидным, а также позволяет использовать несколько файлов с одинаковым базовым именем и разными расширениями, такими как site.html , site.php , site.js , site.css и т. Д. Недостатком, конечно же, является то, что расширение файла и фактический тип / контент файла не обязательно должны совпадать.

Кроме того, это необходимо для межплатформенной совместимости, так как например Windows не будет знать, что делать с файлом readme , а только с файлом readme.txt .

74
ответ дан 22 November 2019 в 23:16

Я хотел бы применить к этому подход, отличный от других ответов, и оспорить мнение о том, что «Linux» или «Windows» имеют к этому какое-то отношение (несите меня).

Концепция расширения файла может быть просто выражена как «соглашение об идентификации типа файла на основе части его имени». Другими распространенными соглашениями для определения типа файла являются сравнение его содержимого с базой данных известных подписей (подход «магического числа») и сохранение его в качестве дополнительного атрибута в файловой системе (подход, использованный в исходной MacOS) .

Поскольку каждый файл в системе Windows или Linux имеет как имя, так и содержимое, процессы, которые хотят знать тип файла, могут использовать либо «расширение», либо «магическое число» по своему усмотрению. Подход с использованием метаданных обычно недоступен, поскольку в большинстве файловых систем нет стандартного места для этого атрибута.

В Windows существует сильная традиция использования расширения файла в качестве основного средства идентификации файла; наиболее заметно то, что графический браузер файлов (Диспетчер файлов в Windows 3.1 и Проводник в современной Windows) использует его, когда вы дваждыщелкните файл, чтобы определить, какое приложение запускать. В Linux (и, в более общем смысле, в системах на основе Unix) существует больше традиций для проверки содержимого; в частности, ядро ​​смотрит в начало исполняемого файла напрямую, чтобы определить, как его запустить; В файлах сценариев можно указать интерпретатор, который следует использовать, начиная с #! , за которым следует путь к интерпретатору.

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

  • проверка содержимого файла довольно затратна по сравнению с проверкой имен файлов; так, например, «найти все файлы с именем * .conf» будет намного быстрее, чем «найти все файлы, первая строка которых соответствует этой сигнатуре»
  • содержимое файла может быть неоднозначным; многие форматы файлов на самом деле представляют собой просто текстовые файлы, обрабатываемые особым образом, многие другие представляют собой zip-файлы со специальной структурой, и определение точных подписей для них может быть сложной задачей
  • ; файл действительно может быть действительным как более чем один тип; файл HTML также может быть допустимым XML, объединенные вместе zip-файл и GIF остаются действительными для обоих форматов.
  • сопоставление магических чисел может привести к ложным срабатываниям; формат файла без заголовка может начинаться с байтов «GIF89a» и быть ошибочно идентифицирован как изображение GIF
  • , переименование файла может быть удобным способом пометить его как «отключенный»; например изменить "foo.conf" на "foo.conf ~", чтобы указать резервную копию, проще, чем редактировать файл, чтобы закомментировать все его директивы, и более удобно, чем перемещать его из автоматически загруженного каталога; аналогично, переименование файла .php в .txt укажет Apache на то, что он должен обслуживать его источник как обычный текст, а не передавать его механизму PHP

Примеры программ Linux, которые используют имена файлов по умолчанию (но могут иметь другие режимы):

  • gzip и gunzip имеют специальную обработку любого файла, заканчивающегося на ".gz"
  • gcc будет обрабатывать файлы ".c" как C, а ".cc" или ".C" как C ++
24
ответ дан 22 November 2019 в 23:16

На самом деле, некоторые технологии действительно полагаются на расширения файлов , поэтому, если вы используете эти технологии в Ubuntu, вам также придется полагаться на расширения. Несколько примеров:

  • gcc использует расширения, чтобы различать файлы C и C ++. Без расширения их практически невозможно различить (представьте файл C ++ без классов).
  • много файлов ( docx , jar , apk ) представляют собой просто особо структурированные ZIP-архивы. Хотя обычно вы можете определить тип по содержимому, это не всегда возможно (например, Java Manifest является необязательным в jar файлах).

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

16
ответ дан 22 November 2019 в 23:16

Ваше первое предположение верно: расширения в Linux не имеют значения и полезны только для людей (и других ОС, отличных от Unix, которые заботятся о расширениях). Тип файла определяется первыми 32 битами данных в файле, которые известны как магическое число . Вот почему сценариям оболочки нужна строка #! - чтобы сообщить операционной системе, какой интерпретатор вызывать. Без него сценарий оболочки представляет собой просто текстовый файл.

Что касается файловых менеджеров, они действительно хотят знать расширения некоторых файлов, таких как файлы .desktop , которые в основном такие же, как версия ярлыков Windows, но с более широкими возможностями. Но что касается ОС, ей нужно знать, что находится в файле, а не то, что указано в его имени

6
ответ дан 22 November 2019 в 23:16

Это слишком большой ответ для комментария.

Имейте в виду, что даже «расширение» имеет много разных значений.

То, о чем вы говорите, похоже, состоит из трех букв после. DOS сделала формат 8.3 очень популярным, и в Windows до сих пор используется часть .3.

В Linux есть много файлов, таких как .conf, .list, .d или .c, которые имеют значение, но на самом деле не являются расширениями в смысле 8.3. Например, Apache просматривает /etc/apache2/sites-enabled/website.conf в поисках своей директивы конфигурации. Хотя система использует типы MIME и заголовки содержимого и то, что не определяет, что это текстовый файл, Apache (по умолчанию) по-прежнему не будет загружать его, если он не оканчивается на .conf.

.c - еще один отличный вариант. Да, это текстовый файл, но gcc зависит от того, становится ли main.c main.o и, наконец, main (после связывания). Ни при каких обстоятельствах система не использует расширение .c, .o или никакое расширение, чтобы иметь какое-либо значение в отношении содержимого, кроме того, что находится после. имеет какое-то значение. Вы, вероятно, настроили бы свой SCM так, чтобы игнорировать main.o и main.

Дело в том, что расширения не используются так, как в окнах. Ядро не выполнит файл .txt, потому что вы удалите часть имени .txt. Также можно с радостью выполнить файл .txt, если установлено разрешение на выполнение. При этом они имеют значение и все еще используются на «компьютерном уровне» для многих вещей.

5
ответ дан 22 November 2019 в 23:16

Как упоминалось другими, в Linux используется метод директивы интерпретатора (сохранение некоторых метаданных в файле в виде заголовка или магического числа, чтобы можно было сказать правильному интерпретатору прочитать его), а не Метод ассоциации расширения имени файла, используемый Windows.

Это означает, что вы можете создать файл практически с любым именем, которое вам нравится ... с некоторыми исключениями

Однако

я хотел бы добавить слово предостережения .

Если в вашей системе есть файлы из системы, в которой используется ассоциация имен файлов, файлы могут не иметь этих магических номеров или заголовков. Расширения имен файлов используются для идентификации этих файлов приложениями, которые могут их читать, и вы можете столкнуться с некоторыми неожиданными эффектами, если переименуете такие файлы. Например:

Если вы переименуете файл My Novel.doc в My-Novel , Libreoffice все равно сможет его открыть, но он будет открыт как «Без названия» и вам придется назвать его снова, чтобы сохранить его (Libreoffice по умолчанию добавляет расширение, поэтому у вас будет два файла My-Novel и My-Novel.odt , которые может раздражать)

Если серьезно, если вы переименуете файл My Spreadsheet.xlsx в My-Spreadsheet, а затем попытаетесь открыть его с помощью xdg-open My-Spreadsheet , вы получите это (потому что это на самом деле сжатый файл):

И если вы переименуете файл My Spreadsheet.xls в My-Spreadsheet , когда вы xdg-open My-Spreadsheet , вы появляется сообщение об ошибке

, где открывается местоположение: ни одно приложение не зарегистрировано как обрабатывающее этот файл

(хотя в обоих случаях он работает нормально, если вы выполняете soffice My-Spreadsheet )

Если вы затем переименуйте экстерьер nsionless в My-Spreadsheet.ods с помощью mv и попробуйте открыть его, вы получите следующее:

(восстановление не удалось)

И вам нужно будет поставить оригинал снова включите расширение, чтобы открыть файл правильно (затем вы можете преобразовать формат, если хотите)

TL; DR:

Если у вас есть неродные файлы с расширениями имен, не удаляйте расширения, предполагая, что все будет ОК!

24
ответ дан 22 November 2019 в 23:16

Другие вопросы по тегам:

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