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

59

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

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

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

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

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

    
задан mizech 27.07.2016 в 08:46
источник

7 ответов

33
  

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

    
ответ дан Rinzwind 27.07.2016 в 09:01
источник
59

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

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

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

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

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

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

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

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

    
ответ дан Byte Commander 27.07.2016 в 09:22
21

Как упоминалось другими, в 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 )

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

(восстановление не выполняется)

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

TL; DR:

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

    
ответ дан Zanna 27.07.2016 в 10:06
16

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

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

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

В Windows существует сильная традиция использования расширения файла в качестве основного средства идентификации файла; наиболее очевидно, что графический браузер файлов (File Manager в Windows 3.1 и Explorer в современных 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 ++
ответ дан IMSoP 27.07.2016 в 19:13
13

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

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

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

    
ответ дан Dmitry Grigoryev 27.07.2016 в 17:52
6

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

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

    
ответ дан Sergiy Kolodyazhnyy 27.07.2016 в 09:02
4

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

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

То, о чем вы говорите, кажется, это три буквы после. DOS сделал формат 8.3 очень популярным, и окна используют часть .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 или no, чтобы иметь какой-либо смысл в отношении контента, но материал после. имеет некоторое значение. Вероятно, вы бы настроили SCM игнорировать main.o и main.

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

ответ дан coteyr 27.07.2016 в 11:15