2015-08-24 2 views
38

Дофтофы, такие как .htaccess.gitignore и .config, имеют расширение файла и не имеют имени файла или считаются ли они именами файлов и не имеют расширения?У dotfiles есть расширение файла?


Я пытаюсь реализовать некоторые вспомогательные функции в PHP, который славится тем, что делает все неправильно, и я заметил, что pathinfo функции РНР считает точечные файлы, чтобы иметь расширение файла и не имени файла, в то время как узел path.extname считают точечные файлы в имеют имя файла и не имеют расширения.

Непонятно, существует ли стандарт или это соответствует предпочтению разработчика.

+0

Очень интересно. Ну, учитывая, что они оба трактуют dotfiles по-разному, кажется разумным предположить, что они оба работают с разными стандартами (независимо от того, существует ли в этом случае «истинный» стандарт). Мысли? –

+0

Интересно. [Boost.Filesystem] (http://www.boost.org/doc/libs/1_59_0/libs/filesystem/doc/reference.html#path-extension), например, считает, что это расширение файла без имя файла. "path extension (const path & p) const;' ... if p.filename() содержит точку, но не состоит только из одной или двух точек, возвращает подстроку p.filename(), начиная с самой правой точки и заканчивается в конце пути. В противном случае возвращает пустой объект пути. " – Anthony

+5

@JoshBeam, PHP имеет тенденцию идти в такт другому барабанщику, а затем выпасть из шага и взять пару неправильных поворотов от этого другого барабанщика. Посмотрите, как он обрабатывает строки запроса или любую из его стандартной библиотеки. Тем не менее, я всегда рассматривал dotfiles как файлы с расширением, не имеющие имени файла, поэтому я был удивлен, что узел будет считать, что у них нет расширения. – zzzzBov

ответ

19

Вы платите свои деньги, и вы берете свой выбор: Да, нет, может быть.

Это сводится к вашему определению «расширение».

  • Действительно ли это «что-нибудь после последней точки в названии»? Если это так, эти файлы не имеют имени и все являются расширением.
  • Это «что-нибудь после точки, которая не является первым символом в названии»? Если это так, эти файлы не имеют расширения.
  • Если вы используете какое-то другое определение, ответ должен быть соответствующим образом скорректирован.

Помните, что SCCS файлов используется префикс s. (среди других, вы бы увидели p. файлы тоже - и там было много переходных имен файлов с другими приставками). У файла SCCS s.something есть расширение или префикс? (С s.source.c, это достаточно прямолинейно, есть префикс, имя и расширение или суффикс, или вы можете игнорировать префикс в качестве специального случая, а имя - s.source, а расширение - .c.) Что относительно исполняемого по умолчанию имя, a.out? Как насчет такого имени, как ..dot; у него есть расширение, и если да, то что это?

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

Anthony Arnold и 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 для идентификации содержимого файлов. Он просматривает содержимое файла для идентификации содержимого; он не обращает внимания на расширение файла (так что ему не нужно решать, что такое расширение).

+1

Да, у UNIX нет понятия расширений, это что-то многослойное сверху, например, программные пусковые установки. Вы также можете спросить, является ли расширение файла для 'x.tar.gz'' tar.gz' или просто 'gz' :-) Для dotfiles. символы '2-x' не имеют ничего общего с типом файла, поэтому я бы не назвал их самим расширением. – paxdiablo

+1

@paxdiablo: Я согласен, что '.htaccess' (например, или' '.profile' или .bashrc') все имя и без расширения, но это зависит от определения расширения, и любое определение потенциально несколько спорное , –

+1

@JonathanLeffler Правда, но полагаться на расширения для чего угодно, кроме удобства, также чревато опасностью. В настоящее время мы, похоже, универсально принимаем '.' в качестве разделителя расширений, и мы обычно полагаемся на расширения как простой индикатор формата файла или использования. Однако он не установлен в камне и не является официальным стандартом. – Anthony

7

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

Имя точечного файла не имеет ничего общего с его типом. Часть после первой точки dotfile - это имя и без расширения. Но dotfile также может иметь расширение (например, .mongorc.js или какой-либо другой скрытый файл в системе UNIX).

Таким образом, я бы сказал, что путь узла path.extname делает это вправо способ.

Верните расширение пути, начиная с последнего '.' до конца строки в последней части пути. Если нет '.' в последней части часть пути или первый символ этого символа - '.', затем он возвращает пустую строку.


Есть две разные вещи здесь:

  • Существует с одной стороны, механизм определения некоторых метаданных расширением в имени файла, например, чтобы открыть его с «по умолчанию» применение в не-unix-like системы.

  • точечных файлов с другой стороны, просто скрытые файлы (с нормальным именем и точкой впереди, чтобы сделать их не видно ls), идущие от Unix-подобных систем. Итак, .gitignore - это всего лишь файл с именем gitignore и отмечены как скрытые - нет расширение здесь.

+1

Я буду играть адвоката дьявола на этом. Расширения файлов обычно используются как подсказка о том, как файл должен обрабатываться операционной системой для их действия по умолчанию. Это просто удобство, так что при двойном щелчке по файлу '.txt' он открывается в вашем любимом текстовом редакторе. Если '.gitignore' обрабатывался операционной системой как не имеющей расширения файла, не было бы последовательного способа сообщить ОС открыть файл в вашем любимом настраиваемом редакторе' .gitignore'. Затем ОС должна рассматривать его как файл без продолжения, как файл с именем 'file', и спросить, как вы хотите его обработать. – zzzzBov

+0

@zzzzBov Было бы неплохо назначить обработчики файлов по умолчанию в соответствии с регулярными выражениями. Таким образом, вы можете использовать любую схему именования, которая вам нравится, вместо привязки к модели расширения. – Anthony

+0

@zzzzBov Я попытался объяснить свое мнение немного больше в редактировании моего ответа. –

3

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

Что вам на самом деле нужно для продления, в данном случае? Файлы, такие как .gitignore, .htaccess и т. Д., Сопоставляются с полным именем файла. Не «расширение» (или отсутствие), а полное имя.

Я бы поспорил с этим вопросом, чтобы избавиться от любой проверки расширений файлов и проверки на имя файла. Например, в PHP:

basename ("/path/to/.htaccess"); 
3

Я бы сказал, что они просто скрыты ... В Unix/Linux, файл/каталог считается скрытый если это первый символ «» (точка), так что это просто первый символ, а не расширение/суффикс.

Кроме того, каталоги также могут быть скрыты, включая «.». а также "..«Текущие и родительские» каталоги - и расширение/суффикс обычно не связаны с каталогами. На самом деле, многие программы создают для них такие скрытые каталоги (например .foo), а не только один файл (например, .foorc).

И, наконец, Unix/Linux никогда не интересовался суффиксами - большинство программ могут читать «свои» файлы без ретрансляции на одном. Вместо этого Unix часто использует тесты из «magic» -file (/ etc ../магия) и file команда отсрочкой на тип файла (заметным исключением являются компрессионные-программы, такие как gzip и bzip2, который заменяет оригинальный с суффиксом сжатой версии)

Я хотел бы добавить, что «гс» - end (для «run-command») - в например .bashrc, .wgetrc, .zshrc и т. д., можно рассматривать как суффикс/расширение для этих типов файлов - событие, хотя между именем и суффиксом нет точки (некоторые - как .rtorrent.rc - действительно имеют точку).

+0

'каталоги также могут быть скрыты, включая«. ». и "..". - Ах, '..' - это просто скрытая версия' .', я вижу ... –

+0

Томас Уэллер: Я не могу сказать, были ли вы шутки или нет; но на всякий случай: '..' является родителем текущего каталога; '.' - текущий каталог. – echristopherson

+0

Не совсем ... ;-) Они * оба * скрыты. Текущий каталог называется "." и родительский каталог называется «..». Но поскольку скрытые файлы/каталоги начинаются с точки в Unix, которые оба «.» и «..» делает - они также оба скрыты ** ... I.e. они не отображаются, если вы делаете простой 'ls' ... вы должны использовать' ls -a' для их просмотра - вместе с другими скрытыми файлами/каталогами. –