У dotfiles есть расширение файла?
У dotfiles, например .htaccess
.gitignore
и .config
, есть расширение файла и нет имени файла, или считается, что у них есть имя файла и нет расширения?
Я пытаюсь реализовать некоторые функции утилиты в PHP, который печально известен тем, что делает что-то неправильно, и я заметил, что функция PHP pathinfo
считает, что dotfiles имеет расширение файла и не имеет имени файла, тогда как node path.extname
считает dotfiles, чтобы иметь имя файла и расширение.
Я не знаю, существует ли стандарт, или это соответствует предпочтению разработчика.
Ответы
Ответ 1
Вы платите свои деньги, и вы берете свой выбор: Да, нет, может быть.
Это зависит от вашего определения "расширение".
- Это "что-нибудь после последней точки в названии"? Если это так, эти файлы не имеют имени и все являются расширением.
- Разве это "что-нибудь после точки, которая не является первым символом в имени"? Если это так, эти файлы не имеют расширения.
- Если вы используете другое определение, тогда ответ необходимо будет соответствующим образом скорректировать.
Помните, что в файлах SCCS использовался префикс s.
(в том числе, вы также видели файлы p.
), и было много преходящих имен файлов с другими префиксами). У файла SCCS s.something
есть расширение или префикс? (С s.source.c
он достаточно прост, там префикс, имя и расширение или суффикс, или вы можете игнорировать префикс в качестве специального случая, а имя s.source
, а расширение - .c
. ) Как насчет исполняемого имени по умолчанию, a.out
? Как насчет имени, такого как ..dot
; имеет ли он расширение, и если да, то что это такое?
Обратите внимание, что ответ на DOS был более формализован. Там файловая система использовалась для принудительного исполнения (один раз в другое тысячелетие или около того) имена с 8.3, и расширение было ощутимым. Но это ушедшая эпоха по большей части (и мало кто ее пропустил).
Энтони Арнольд и paxdiablo оба отметили, что имена, заканчивающиеся на .tar.gz
, существуют, - что расширение на такие файлы?
Если вы относитесь к расширению somecode-8.76.tar.gz
как к чему-либо, кроме .gz
, вы открываете себя до мешковины. Содержащийся файл somecode-8.76.tar
; что само по себе можно утверждать, что имеет расширение .tar
. Определение расширения всего gzipped tar файла как .tar.gz
вызывает вопрос "почему это не он .76.tar.gz
", а также означает, что вам нужно пересмотреть соглашение об именах файлов SCCS. Поглощение части .76
имени в .76.tar.gz
или .76.tar
в качестве суффикса действительно делает жизненный комплекс действительно. Это действительный вопрос, но ничего, кроме "расширения, является строкой от последней точки до конца имени", действительно чревато или требует интерпретации значения расширения и попадает в другую сложную область, в которой обычно лучше избегать.
Обратите внимание, что Unix на уровне O/S или файловой системы не заботится о расширении файлов. Программы могут решить, что они волнуют расширения, но это зависит от программы. Расширение является индикатором типа файла; это не является окончательным. Вот почему существует программа file
для идентификации содержимого файлов. Он просматривает содержимое файла для идентификации содержимого; он не обращает внимания на расширение файла (поэтому ему не нужно решать, что такое расширение).
Ответ 2
Причина, по которой кто-то хочет знать расширение файла, заключается в том, что он хочет знать тип (или некоторые другие метаданные) файла, правильно?
Имя точечного файла не имеет никакого отношения к его типу. Часть после первой точки dotfile - это имя и не имеет расширения. Но dotfile также может иметь расширение (например, .mongorc.js
или какой-либо другой скрытый файл в системе UNIX).
Итак, я бы сказал, что путь node path.extname
делает это правильно.
Верните расширение пути, начиная с последнего '.' до конца строки в последней части пути. Если нет '.' напоследок часть пути или его первый символ - это ".", затем возвращает пустую строку.
Здесь есть две разные вещи:
-
Существует, с одной стороны, механизм определения некоторых метаданных с помощью
расширение имени файла, например, чтобы открыть его с помощью "по умолчанию",
приложения в системах без unix-.
-
С другой стороны, Dotfiles - это просто скрытые файлы (с обычным именем
и точка впереди, чтобы они не были видны ls
), исходящие из
unix-like. Итак, .gitignore
- это просто файл с именем gitignore и помеченный как скрытый - здесь нет расширения.
Ответ 3
Я чувствую, что мне нужно оставить ответ, касающийся фактической проблемы пользователя.
Что вам на самом деле нужно для расширения, в данном случае? Файлы, такие как .gitignore
, .htaccess
и т.д., Сопоставляются с полным именем файла. Не "расширение" (или отсутствие), а полное имя.
Я бы стал аргументом в пользу устранения каких-либо проверок расширений файлов и проверки имени файла. Например, в PHP:
basename ("/path/to/.htaccess");
Ответ 4
Я бы сказал, что они просто скрыты... В Unix/Linux каталог файлов/файлов считается скрытым, если он первый символ ".". (точка), так что это просто первый символ, а не расширение/суффикс.
Кроме того, каталоги также могут быть скрыты, включая ".". и ".." (текущие и родительские) каталоги - и расширение/суффикс обычно не связаны с каталогами. Фактически, многие программы создают такие скрытые каталоги для себя (например .foo), а не только для одного файла (например,.foorc).
Наконец, Unix/Linux никогда не касался суффиксов, так как большинство программ умеют читать "свои" файлы без ретрансляции на одном. Вместо этого Unix часто использует тесты из "magic" -file (/etc/magic) и команды file
, чтобы сдерживать тип файла. (Примечательным исключением являются программы сжатия, такие как gzip
и bzip2
, который заменяет оригинал сжатой сжатой версией).
Я бы добавил, что "rc" -изменение (для "run-command" ) - например,.bashrc,.wgetrc,.zshrc и т.д. можно рассматривать как суффикс/расширение для этих типов файлы - событие, хотя между именем и суффиксом нет точки (некоторые - как .rtorrent.rc - действительно имеют точку).