Ответы:
*.*
под старыми системами 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
переменная может быть установлен соответствующим образом , но это другой вопрос!
Это glob
в bash, ниже я привел цитату из руководства bash:
bash - GNU Bourne-Again Sheell
*
Соответствует любой строке, включая пустую строку. Когда опция оболочки globstar включена и
*
используется в контексте расширения имени пути, два соседних,*s
используемых в качестве единого шаблона, будут соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов. Если после следует/
два соседних,*s
будут совпадать только каталоги и подкаталоги.
В этом случае *.*
сопоставьте любые файлы, которые содержат точку .
в своем имени.
Вы можете увидеть более подробную информацию здесь .
Звездочка *
является glob
в оболочке языка. Цитирование из командного языка оболочки :
Звездочка (
'*'
) - это шаблон, который должен соответствовать любой строке, включая нулевую строку.
Тем не менее, он не совпадает с именами файлов, начинающимися с, .
если не установлена опция оболочки dotglob
.
Когда вы используете *.*
, это соответствует всему, что:
.
.
Вы также можете обратиться к расширению имени файла в руководстве.
Многие люди из Windows думают, что *.*
это все файлы. На Windows это так. В UNIX это все файлы, которые содержат хотя бы 1 точку в своем имени. *
само по себе прекрасно работает в Windows (начиная с ранних версий DOS); однако старые учебники опубликованы, *.*
и это, кажется, трудно сломать привычку.
*
подстановочный знак, используемый оболочкой для расширения имени файла , также известный как «глобализация». *
расширяется до чего угодно, включая ничего (например, *.*
будет соответствовать file.
и т. д.). Другой общий подстановочный знак ?
, который соответствует любому отдельному символу.
Не путайте функцию этих подстановочных знаков с использованием одних и тех же символов в регулярных выражениях (например, тех, которые используются с grep).
Это звезда-точка-звезда - по крайней мере, в мире DOS (а позже, конечно, Windows). В DOS точка .
имеет особое магическое значение, потому что имена файлов состоят из восьми символов (позже они будут расширены, но давайте останемся прежними) и трехсимвольного расширения (которое определило тип файла). В Unix тип файла обычно определяется первыми двумя байтами файла (или другой магией), а расширение является информативным, но не имеет большого значения. За исключением случаев, когда все это стало размытым.
Так что в Unix особого смысла нет. Звездочка - это «глобирующий» символ в оболочках Unix и подстановочный знак для любого количества символов (включая ноль). ?
является еще одним распространенным подстановка символов, соответствие точно один любой символ.
*.*
соответствует любым именам файлов, которые содержат хотя бы одно .
. У него нет специального имени или какого-либо значения, кроме *a*
или *_*
. И *.?
будет сопоставлять любые файлы с точкой и ровно одним символом после этой точки. Существуют также более сложные расширенные шаблоны глобинга - см. Справочную страницу вашей оболочки.
В «Словаре нового хакера» (расширение старого MIT «Jargon File») отмечается, что «звезда» - это наиболее распространенное имя для *
символа (сопровождаемое splat
), и я думаю, что это все еще верно на практике, и .
определенно обычно » точка », поэтому, хотя он не имеет какого-либо внутреннего особого значения в качестве конгломерированного символа, последовательность по-прежнему разумно называется звездой-точкой-звездой в Unix. (Это просто менее полезно.)
Здесь есть фактически 2 символа, звездочка *
и точка .
. Оболочки обычно интерпретируют звездочку как любой символ, но в регулярном выражении это будет означать жадный шар. В этом случае он будет соответствовать всему, что не заканчивается или начинается с точки, но содержит хотя бы одну:
somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
onlydotatend.
случай совпадает, конечно?
touch 'onlydotatend.' && echo *.*
не возвращает
bash
и dash
. Какую оболочку вы используете?
zsh
конфигурации, и там тоже работает. Я не понимаю, как onlydotatend.
не может быть совпадение, есть вариант конфигурации, который делает это?
*7.*
, получить все файлы, у которых последний символ перед расширением - «а»7
, а с помощью «*sa*
я» - все файлы, которые содержат подстроку вsa
любом месте этого имени файла, и так далее. (Соответственно, в статье вы цитируете озаглавлена Как же подстановочные работать в MS-DOS ? (Курсив мой сам).)