Як називається символ *. *?


Відповіді:


20

Інтерпретація *.*старих систем Windows / DOS

Значення тут більше пов'язане з Windows / DOS, ніж з Unix / Linux. Для старих системних систем Windows / DOS це був шаблон «wildcard». Шаблони підстановок використовувались для узгодження імен файлів аналогічно глобусам Unix. *.*Підставкова широко використовується , щоб відповідати будь-якого файлу.

Як і у глобальній галузі Unix, засіб *буде відповідати будь-якій послідовності символів у імені файлу, як така *сама по собі також буде відповідати будь-якому файлу. Однак причина, через яку *.*буде відповідати будь-яке ім'я файлу, пов’язана з відмінностями в роботі цих символів. Відповідно до цієї статті :

Будь-які символи, окрім точки, що з’являються після зірочки, не мають ефекту, оскільки зірочка переміщує курсор у положення 12, і в цей момент нічого не змінює стан розбору, крім точки, яка очищає три останні позиції і переміщує курсор.

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

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

Інтерпретація *.*оболонок Unix

У оболонках Unix, як вказували інші, це означає «розширення імені шляху» або «глобул». *Не мають непарні стрибків до кінцевого поведінки і , отже , не призводить до персонажам наступних він ігнорується. *.*Шаблон буде відповідати будь-якому імені файлу, що містить крапку (за винятком початку). Це однозначно не відповідатиме жодному файлу, оскільки в системі Unix / Linux є багато файлів, які не мають розширення (або в іншому випадку містять крапку, оскільки це теж дозволено).

Причиною *.*невідповідності точки на початку імені файлів у Unix є те, що ставлення крапки на початку - це те, як файли "приховані", а приховані файли за замовчуванням виключаються з глобусів. Щоб їх відповідати в оболонці POSIX, крапку потрібно поставити явно на початку шаблону. В bashпо dotglobвибору оболонки може бути встановлена або GLOBIGNOREзмінна може бути встановлений відповідним чином , але це інше питання!


1
Слід зазначити, що, здається, поточні версії Windows поводяться більш логічно. Зокрема, "Будь-які символи, окрім крапки, що з’являються після зірочки, не мають ефекту" вже не відповідають дійсності; принаймні під час фільтрації файлів у стандартному діалоговому вікні Open File в Windows 7 за шаблоном *7.*, отримуйте всі файли, останнім символом яких перед розширенням є a 7, і з *sa*, я отримую всі файли, що містять підрядку в saбудь-якому місці імені файлу тощо. (Відповідно, стаття, яку ви цитуєте, має назву Як працювали підстановки в MS-DOS ? (Наголос додав я сам).
АБО Mapper

1
@ORMapper, оновив заголовки, щоб відобразити це. Така поведінка є попередньою для Windows 95, що є у відповіді (хоча заголовок був оманливим).
Graeme

11

Це globв bash, Нижче я цитував посібник з bash:

bash - GNU Bourne-Again SHell

*

Відповідає будь-якому рядку, включаючи нульовий рядок. Коли параметр оболонки globstar увімкнено та *використовується в контексті розширення імені шляху, два суміжні, *sвикористовувані як єдиний шаблон, будуть відповідати всім файлам та нульовим або більше каталогів та підкаталогів. Якщо слідує a /, два суміжні *sбудуть відповідати лише каталогів і підкаталогів.

У цьому випадку *.*підберіть будь-які файли, які містять крапку .в його імені.

Більш детальну інформацію ви можете подивитися тут .


8

Зірочка *є globмовою оболонки. Цитування з мови командної оболонки :

Зірочка ( '*') - це шаблон, який повинен відповідати будь-якій рядку, включаючи нульову рядок.

Однак, вони не відповідають ім’ям файлів, починаючи з, .якщо не встановлено параметр оболонки dotglob.

Під час використання *.*він відповідає будь-якому:

  • не починається з a .
  • містить хоча б одну .

Також ви можете звернутися до Розширення імені файлів у посібнику.


6

Багато людей, які приїжджають з Windows, думають, що *.*це для всіх файлів. У Windows це так. У UNIX усі файли містять принаймні 1 крапку у своєму імені. *сам по собі працює чудово в Windows (датується повністю до раннього DOS); однак старі підручники, опубліковані, *.*і, здається, важко звикнути зламати.


4

*являє собою підстановку, яка використовується оболонкою для розширення імені файлу , також відома як "глобулінг". *розширюється на що завгодно, включаючи нічого (наприклад, *.*буде відповідати file.тощо). Інший загальний підстановочний знак ?, який відповідає будь-якому одному символу.

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


3

Це зірка-точка-зірка - принаймні, у світі DOS (а пізніше, звичайно, Windows). У DOS крапка .має особливе магічне значення, оскільки назви файлів - це восьми символьна база (пізніше розширена, але давайте залишимось старою школою) та трисимвольне розширення (яке визначало тип файлу). У Unix тип файлу зазвичай визначається першими двома байтами файлу (або іншою магією), а розширення є інформативним, але не має великого значення. За винятком випадків, коли це все розмилося.

Отже, в Unix особливого значення немає. Зірочка є символом "глобінгу" в оболонках Unix і є символом для будь-якої кількості символів (включаючи нуль). ?- це ще один загальний глобальний персонаж, що відповідає точно одному з будь-яких символів.

*.*відповідає будь-яким іменам, які містять принаймні одне .. Він не має спеціального імені або якогось значення, більш ніж *a*або *_*. І *.?відповідатиме будь-яким файлам із крапкою та точно одним символом після цієї крапки. Існують також кілька складніших моделей розширеного глобулювання - дивіться сторінку чоловіка вашої оболонки.

"Словник нового хакера" (розширення старого файлу "Жаргон" MIT) зазначає, що "зірка" є найпоширенішою назвою для цього *символу (далі splat), і я думаю, що це все-таки актуально на практиці, і ., безумовно, зазвичай " крапка ", тому, хоча він не має ніякого внутрішнього особливого значення як конгломерований символ, послідовність все ще прийнято називати зіркою-крапкою-зіркою в Unix. (Це просто менш корисно.)


Це може здатися дивним, але дякую вам за те, що ви згадали про "зіркову зірку", саме це зробило цю сторінку доступною для роботи в Google!
Score_Under

3

Тут насправді є 2 символи, зірочка *та крапка .. Оболонки зазвичай інтерпретують лише зірочку як будь-який персонаж, але в регулярному виразі це означатиме жадібну глобус. У цьому випадку воно буде відповідати тому, що не закінчується або починається з крапки, але містить принаймні одну:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match

1
Ваш onlydotatend.випадок - це збіг, звичайно?
Graeme

@Graeme nope. touch 'onlydotatend.' && echo *.*не повертає його
Брайам

1
Це для мене! І на bashі dash. Яку оболонку ви використовуєте?
Graeme

@Graeme zsh, і ти маєш рацію.
Брайам

Я просто спробував це на ванільній zshконфігурації, і він працює і там. Я не розумію, як onlydotatend.не може бути збіг, чи є варіант конфігурації, який робить це?
Graeme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.