Linux определяет тип файла с помощью кода в заголовке файла. Это не зависит от расширений файлов, позволяющих узнать, какое программное обеспечение следует использовать для открытия файла.
Это то, что я помню из моего образования. Пожалуйста, поправьте меня, если я ошибаюсь!
Работа немного с системами Ubuntu недавно: Я вижу много файлов на системах , которые имеют расширения , такие как .sh
, .txt
, .o
,.c
Теперь мне интересно: эти расширения предназначены только для людей? Чтобы понять, что это за файл?
Или у них тоже есть какая-то цель для операционной системы?
files
file-format
mime-type
mizech
источник
источник
gzip
,bzip2
,xz
- и так далее. Эти программы используют суффиксы для отделения сжатой версии файла от несжатой версии, которую они заменяют. Программы сжатия часто будут жаловаться на неправильный суффикс, даже если файл на самом деле является сжатым файлом того типа, который должен обрабатывать.Ответы:
Когда вы взаимодействуете с другими операционными системами, которые зависят от того, какими расширениями они являются, разумнее использовать их.
В Windows открывающее программное обеспечение прикреплено к расширениям.
Открытие текстового файла с именем «файл» в Windows , сложнее , чем открыть тот же файл с именем «file.txt» (вам нужно будет переключить диалог открытия файла с
*.txt
в*.*
каждый раз). То же самое касается TAB и текстовых файлов, разделенных точкой с запятой. То же самое касается импорта и экспорта электронной почты (расширение .mbox).В частности, когда вы пишете программное обеспечение. Открытие файла с именем «software1», который является файлом HTML, и «software2», который является файлом JavaScript, становится более сложным по сравнению с «software.html» и «software.js».
Если в Linux есть система, в которой важны расширения файлов, я бы назвал это ошибкой. Когда программное обеспечение зависит от расширений файлов, это можно использовать. Мы используем директиву интерпретатора, чтобы определить, что это за файл («первые два байта в файле могут быть символами« #! », Которые составляют магическое число» (шестнадцатеричные 23 и 21, значения ASCII «#» и «! ") часто упоминается как Шебанг").
Самой известной проблемой с расширениями файлов была LOVE-LETTER-FOR-YOU.TXT.vbs в Windows. Это визуальный базовый скрипт, который отображается в проводнике как текстовый файл.
В Ubuntu, когда вы запускаете файл из Nautilus, вы получаете предупреждение о том, что он собирается делать. Выполнение скрипта из Nautilus, где он хочет запустить какое-то программное обеспечение, где предполагается открыть gEdit, является очевидной проблемой, и мы получаем предупреждение об этом.
В командной строке, когда вы выполняете что-то, вы можете визуально увидеть, что такое расширение. Если это заканчивается на .vbs, я начинаю подозревать (не то, что .vbs исполняется в Linux. По крайней мере, без дополнительных усилий;)).
источник
readme.txt
и делаете его исполняемым. Если пользователь выполнил его, он не открывает редактор, но запускает код. В этом отношении создание расширений важно (но не скрывает их) более безопасно и легче для объяснения для неопытных пользователей. Существуют и другие отличия (в частности, не выполняются файлы из текущего каталога), но они не имеют ничего общего с расширениями.readme.txt
файл в текстовом редакторе. Я только что попробовал с dolphin в KDE, создав сценарий оболочки, добавив исполняемый файл, сохранив его как.txt
и нажав на него, и он откроется в Kate. Если я переименую его,.sh
то щелчок по нему запускает его.file
основано на эвристике, не определено.Здесь нет 100% черного или белого ответа.
Обычно Linux не полагается на имена файлов (и расширения файлов, т.е. часть имени файла после обычно последнего периода), а вместо этого определяет тип файла, изучая первые несколько байтов его содержимого и сравнивая его со списком известных магических чисел. ,
Например, все файлы растровых изображений (обычно с расширением имени
.bmp
) должны начинаться с буквBM
в первых двух байтах. Скрипты в большинстве языков сценариев, таких как Bash, Python, Perl, AWK и т. Д. (В основном все, что обрабатывает строки, начинающиеся с#
комментария), могут содержать шебанг, как#!/bin/bash
в первой строке. Этот специальный комментарий сообщает системе, с помощью какого приложения открывать файл.Поэтому обычно операционная система полагается на содержимое файла, а не на его имя, чтобы определить тип файла, но заявить, что расширения файлов никогда не нужны в Linux, - это только половина правды.
Приложения могут, конечно, осуществлять свои проверки файлов по своему усмотрению, включая проверку имени и расширения файла. Примером является Eye of Gnome (
eog
стандартный просмотрщик изображений), который определяет формат изображения по расширению файла и выдает ошибку, если он не соответствует содержимому. Будь то ошибка или особенность, можно обсудить ...Однако даже некоторые части операционной системы полагаются на расширения имен файлов, например, при разборе исходных файлов вашего программного обеспечения
/etc/apt/sources.list.d/
-*.list
анализируются только файлы с расширением, все остальные игнорируются. Возможно, он в основном используется не для определения типа файла, а для включения / отключения анализа некоторых файлов, но это все еще расширение файла, которое влияет на то, как система обрабатывает файл.И, конечно, прибыль пользователей человека большинство из расширений файлов , как это делает тип файла очевидного , а также позволяет использовать несколько файлы с тем же базовым именем и различные расширения , такими как
site.html
,site.php
,site.js
,site.css
расширение и т.д. Недостатком является то, конечно , этим файлом и фактическим Тип файла / содержание не обязательно должны совпадать.Кроме того, это необходимо для межплатформенного взаимодействия, например, Windows не будет знать, что делать с
readme
файлом, а только areadme.txt
.источник
#!
. Все остальное зависит от решения какого-либо приложения.eog
и я не знаю, почему они вообще заботятся об имени файла. Это ошибка на мой взгляд. И, конечно, если файл называется «bmp», но его формат содержимого не совпадает, конечно, также будет ошибка. Конечно, каждое приложение решает, как проверять файлы, но в целом приложения Linux не должны полагаться на имя. Кстати, вы можете использоватьfile
commend для проверки типов файлов по их содержимому.file
утилиты на самом деле ничего не доказывает; это полезный инструмент, который может существовать в любой ОС. Какая фундаментальная часть ОС делает работуfile
более «правильной», чем использование имени файла?Как уже упоминалось другими, в 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
)Если переименовать файл extensionless к
My-Spreadsheet.ods
сmv
и попытаться открыть его , вы получите это:(ремонт не удается)
И вам придется снова установить оригинальное расширение, чтобы правильно открыть файл (затем вы можете преобразовать формат, если хотите)
TL; DR:
Если у вас есть неродные файлы с расширениями имени, не удаляйте расширения, если все будет в порядке!
источник
Я хотел бы использовать другой подход к этому из других ответов и оспорить идею о том, что «Linux» или «Windows» имеют какое-либо отношение к этому (терпите меня).
Понятие расширения файла может быть просто выражено как «соглашение для идентификации типа файла на основе части его имени». Другие общие соглашения для определения типа файла сравнивают его содержимое с базой данных известных сигнатур (подход «магического числа») и сохраняют его как дополнительный атрибут в файловой системе (подход, используемый в оригинальной MacOS) ,
Поскольку каждый файл в системе Windows или Linux имеет как имя, так и содержимое, процессы, которые хотят знать тип файла, могут использовать подходы «расширение» или «магическое число» по своему усмотрению. Подход метаданных обычно недоступен, так как в большинстве файловых систем нет стандартного места для этого атрибута.
В Windows существует сильная традиция использовать расширение файла в качестве основного средства идентификации файла; Наиболее заметно, что графический файловый браузер (File Manager в Windows 3.1 и Explorer в современной Windows) использует его, когда вы дважды щелкаете файл, чтобы определить, какое приложение запустить. В Linux (и, в более общем случае, в системах на основе Unix), существует больше традиций для проверки содержимого; в частности, ядро смотрит на начало файла, который выполняется непосредственно, чтобы определить, как его запустить; Файлы сценариев могут указывать на использование интерпретатора, начиная с имени,
#!
за которым следует путь к интерпретатору.Эти традиции влияют на дизайн пользовательского интерфейса программ, написанных для каждой системы, но есть множество исключений, потому что у каждого подхода есть свои плюсы и минусы в разных ситуациях. Причины использования расширений файлов вместо изучения содержимого включают в себя:
Примеры программ Linux, которые используют имена файлов по умолчанию (но могут иметь другие режимы):
источник
#!
в начале. Любой файл с его набором исполняемых битов может быть выполнен одним из нескольких способов.#!/bin/bash
и подобные подписи просто указывают, какой интерпретатор использовать. Если такая подпись не указана, подразумевается интерпретатор оболочки по умолчанию. Файл, содержащий только два слова «Hello World», но с установленным битом выполнения, при запуске попытается найти команду «Hello».На самом деле, некоторые технологии действительно полагаться на расширениях файлов, так что если вы используете эти технологии в Ubuntu, вам придется полагаться на расширениях тоже. Несколько примеров:
gcc
использует расширения, чтобы различать файлы C и C ++. Без расширения их практически невозможно дифференцировать (представьте себе файл C ++ без классов).docx
,jar
,apk
) только особенно структурированы ZIP архивы. Хотя вы обычно можете определить тип по содержимому, это не всегда возможно (например, Java Manifest не является обязательным вjar
файлах).Не использовать расширения файлов в таких случаях будет возможно только с помощью хакерских обходных путей и, вероятно, будет очень подвержен ошибкам.
источник
gcc
является внешним интерфейсом для файлов C, для файлов C ++ вам нужен либо внешнийg++
интерфейс, либо переключатель командной строки для указания языка. Более важной являетсяmake
программа, которая решает, использовать лиgcc
илиg++
создать конкретный файл, иmake
полностью зависит от шаблонов имен файлов (в основном, от расширений) для соответствия правилам..cc
расширениемgcc
он действительно будет скомпилирован как C ++, и это задокументировано вman gcc
: «Для любого входного файла суффикс имени файла определяет, какой тип компиляции выполняется:», за которым следует список расширения и как они рассматриваются.make
также хороший пример, но онgcc
также сильно зависит от имен файлов. Вот пример, более понятный, чем.c
vs.cc
: Для Cgcc
использует суффиксы, чтобы указать, является ли его первым шагом preprocess (.c
), compile (.i
), assembly (.s
) или link (.o
). Здесь я использую-E
,-S
и-c
сказать ,gcc
где остановиться , но он использует имена файлов , чтобы знать , где начать .gcc something.cc
не будет ссылаться на нужные библиотеки для C ++, но будет рассматривать файл как C ++, поэтому многих пользователей смущают сообщения об ошибках, которые они получают при совершении этой ошибки.Ваше первое предположение верно: расширения в Linux не имеют значения и полезны только для людей (и других не-Unix-подобных ОС, которые заботятся о расширениях). Тип файла определяется первыми 32 битами данных в файле, которые известны как магическое число. Вот почему сценариям оболочки требуется
#!
строка - чтобы сообщить операционной системе, какой интерпретатор вызывать. Без него сценарий оболочки - это просто текстовый файл.Что касается файловых менеджеров, они хотят знать расширения некоторых файлов, таких как
.desktop
файлы, которые в основном совпадают с версией ярлыков Windows, но имеют больше возможностей. Но что касается ОС, она должна знать, что находится в файле, а не в его названии.источник
gunzip
, не распаковывает файл, если он не вызываетсяfoo.gz
.gunzip
это один пример,eog
это другой. Кроме того, многие инструменты не будут автозаполнять имена без правильного расширения. Все, что я говорю, это то, что это немного сложнее, чем «расширения всегда не имеют значения».Это слишком большой ответ на комментарий.
Имейте в виду, что даже «расширение» имеет много, если разные значения.
То, о чем вы говорите, похоже, состоит из 3 букв после. 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 или no, чтобы иметь какое-либо значение для содержимого, но для содержимого после. действительно имеет какое-то значение. Вы, вероятно, настроите свой SCM на игнорирование main.o и main.
Дело в том, что расширения не используются так, как в окнах. Ядро не выполнит файл .txt, потому что вы удалите часть имени .txt. Также очень рад выполнить файл .txt, если установлено разрешение на выполнение. При этом, они имеют значение, и все еще используются на «компьютерном уровне» для многих вещей.
источник
x.3
схеме именования больше, вы получили больше расширений там, а как.doxc
,.torrent
,.part
и т.д. Это просто , что многие форматы файлов и расширения уже были определены еще в то время , когда 8,3 именование было еще вещь , и позже форматы в основном просто адаптировали соглашение использования до 3 букв.gzip
ваш Makefile и т. Д.) Могут быть написаны для использования этого соглашения, чтобы делать предположения о правильном действии для каждого файла.dir
из командной строки не скажет мне ничего подобного; это просто не волнует. Выполнение файлов, безусловно, является исключением в обеих ОС; если бы вопрос был ограничен этими вопросами, то ответом было бы то, что DOS / Windows заботится только о имени, а Unix / Linux - только разрешение на выполнение и первые байты файла. Помимо этого, всегда есть какое-то приложение, выбирающее соглашение, которому нужно следовать.