Как называется символ *. *?

Ответы:

20

Интерпретация *.*под старыми системами Windows / DOS

Значение здесь больше связано с Windows / DOS, чем с Unix / Linux. В старых системах Windows / DOS это был шаблон с подстановочными знаками. Шаблоны подстановочных знаков использовались для сопоставления имен файлов аналогично глобусам Unix. *.*Подстановочная широко используется , чтобы соответствовать любому файлу.

Как и в случае с глобусом Unix, переменная *будет соответствовать любой последовательности символов в имени файла, так как *сама по себе она также будет соответствовать любому файлу. Однако причина, по которой также *.*будет совпадать любое имя файла, связана с различиями в работе этих подстановочных знаков. Согласно этой статье :

Любые символы, кроме точки, которые идут после звездочки, не имеют никакого эффекта, поскольку звездочка перемещает курсор в позицию 12, в которой ничто не изменяет состояние анализа, кроме точки, которая очищает последние три позиции и перемещает курсор.

Такое поведение (несколько странное с точки зрения Unix) означает, что точка, следующая за a *, на самом деле не соответствует точке, а является просто хакерским способом, позволяющим вам добавить больше символов в шаблон. Это означает, что добавление еще одного *будет соответствовать чему-либо в этих последних трех позициях.

Это имеет немного больше смысла, если учесть, что синтаксис использовался в DOS и старых системах Windows до Windows 95, для которой требовалось 8,3 имени файла . Эти имена файлов могли иметь только одну точку и не более трех символов после точки. Большинство, если не все файлы в системе будут иметь трехсимвольное расширение (даже если технически более короткое или расширение не будет разрешено), поэтому я думаю, что имеет смысл использовать его *.*для сопоставления с любым файлом (по крайней мере, с искаженной точки зрения логики Windowsey). ).

Интерпретация *.*в Unix оболочках

В оболочках Unix, как указывали другие, это представляет собой «расширение пути» или «глоб». *Не имеют нечетные прыжков до конечного поведения и , следовательно , не приводит к персонажам следующих он игнорируется. *.*шаблон будет соответствовать любому имени файла, содержащему точку (кроме как в начале). Это определенно не будет соответствовать ни одному файлу, так как в системе Unix / Linux есть много файлов, которые не имеют расширения (или иным образом содержат точку, поскольку это тоже разрешено).

Причина, по которой *.*точка Unix не совпадает с точкой в ​​начале имен файлов, заключается в том, что точка в начале означает, что файлы «скрыты», а скрытые файлы по умолчанию исключаются из глобусов. Чтобы сопоставить их в оболочке POSIX, необходимо вначале поставить точку в начале шаблона. В bashпо dotglobвыбору оболочки может быть установлена или GLOBIGNOREпеременная может быть установлен соответствующим образом , но это другой вопрос!

Graeme
источник
1
Следует отметить, что текущие версии Windows, похоже, ведут себя более логично. В частности, «любые символы, кроме точки, которые идут после звездочки, не имеют никакого эффекта» больше не соответствуют действительности; по крайней мере, при фильтрации файлов в стандартном диалоговом окне « Открыть файл » в Windows 7 по шаблону *7.*, получить все файлы, у которых последний символ перед расширением - «а» 7, а с помощью « *sa*я» - все файлы, которые содержат подстроку в saлюбом месте этого имени файла, и так далее. (Соответственно, в статье вы цитируете озаглавлена Как же подстановочные работать в MS-DOS ? (Курсив мой сам).)
ИЛИ Mapper
1
@ORMapper, обновил заголовки, чтобы отразить это. Это поведение до Windows 95, которая находится в ответе (хотя заголовок вводил в заблуждение).
Грэм
11

Это globв bash, ниже я привел цитату из руководства bash:

bash - GNU Bourne-Again Sheell

*

Соответствует любой строке, включая пустую строку. Когда опция оболочки globstar включена и *используется в контексте расширения имени пути, два соседних, *sиспользуемых в качестве единого шаблона, будут соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов. Если после следует /два соседних, *sбудут совпадать только каталоги и подкаталоги.

В этом случае *.*сопоставьте любые файлы, которые содержат точку .в своем имени.

Вы можете увидеть более подробную информацию здесь .

cuonglm
источник
8

Звездочка *является globв оболочке языка. Цитирование из командного языка оболочки :

Звездочка ( '*') - это шаблон, который должен соответствовать любой строке, включая нулевую строку.

Тем не менее, он не совпадает с именами файлов, начинающимися с, .если не установлена ​​опция оболочки dotglob.

Когда вы используете *.*, это соответствует всему, что:

  • не начинается с .
  • содержит как минимум один .

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

devnull
источник
6

Многие люди из Windows думают, что *.*это все файлы. На Windows это так. В UNIX это все файлы, которые содержат хотя бы 1 точку в своем имени. *само по себе прекрасно работает в Windows (начиная с ранних версий DOS); однако старые учебники опубликованы, *.*и это, кажется, трудно сломать привычку.

Джошуа
источник
4

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

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

лютик золотистый
источник
3

Это звезда-точка-звезда - по крайней мере, в мире DOS (а позже, конечно, Windows). В DOS точка .имеет особое магическое значение, потому что имена файлов состоят из восьми символов (позже они будут расширены, но давайте останемся прежними) и трехсимвольного расширения (которое определило тип файла). В Unix тип файла обычно определяется первыми двумя байтами файла (или другой магией), а расширение является информативным, но не имеет большого значения. За исключением случаев, когда все это стало размытым.

Так что в Unix особого смысла нет. Звездочка - это «глобирующий» символ в оболочках Unix и подстановочный знак для любого количества символов (включая ноль). ?является еще одним распространенным подстановка символов, соответствие точно один любой символ.

*.*соответствует любым именам файлов, которые содержат хотя бы одно .. У него нет специального имени или какого-либо значения, кроме *a*или *_*. И *.?будет сопоставлять любые файлы с точкой и ровно одним символом после этой точки. Существуют также более сложные расширенные шаблоны глобинга - см. Справочную страницу вашей оболочки.

В «Словаре нового хакера» (расширение старого MIT «Jargon File») отмечается, что «звезда» - это наиболее распространенное имя для *символа (сопровождаемое splat), и я думаю, что это все еще верно на практике, и .определенно обычно » точка », поэтому, хотя он не имеет какого-либо внутреннего особого значения в качестве конгломерированного символа, последовательность по-прежнему разумно называется звездой-точкой-звездой в Unix. (Это просто менее полезно.)

mattdm
источник
Это может показаться странным, но спасибо, что упомянули «звездная точка-звезда», именно это сделало эту страницу доступной для Google!
Score_Under
3

Здесь есть фактически 2 символа, звездочка *и точка .. Оболочки обычно интерпретируют звездочку как любой символ, но в регулярном выражении это будет означать жадный шар. В этом случае он будет соответствовать всему, что не заканчивается или начинается с точки, но содержит хотя бы одну:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
Braiam
источник
1
Ваш onlydotatend.случай совпадает, конечно?
Грэм
@ Graeme Нету. touch 'onlydotatend.' && echo *.*не возвращает
Braiam
1
Делает для меня! На обоих bashи dash. Какую оболочку вы используете?
Грэм
@ Грэм зш, и ты прав, bash нет.
Брайам
Я только что попробовал это на ванильной zshконфигурации, и там тоже работает. Я не понимаю, как onlydotatend.не может быть совпадение, есть вариант конфигурации, который делает это?
Грэм