Відповіді:
*.*
старих систем 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
змінна може бути встановлений відповідним чином , але це інше питання!
Це glob
в bash, Нижче я цитував посібник з bash:
bash - GNU Bourne-Again SHell
*
Відповідає будь-якому рядку, включаючи нульовий рядок. Коли параметр оболонки globstar увімкнено та
*
використовується в контексті розширення імені шляху, два суміжні,*s
використовувані як єдиний шаблон, будуть відповідати всім файлам та нульовим або більше каталогів та підкаталогів. Якщо слідує a/
, два суміжні*s
будуть відповідати лише каталогів і підкаталогів.
У цьому випадку *.*
підберіть будь-які файли, які містять крапку .
в його імені.
Більш детальну інформацію ви можете подивитися тут .
Зірочка *
є glob
мовою оболонки. Цитування з мови командної оболонки :
Зірочка (
'*'
) - це шаблон, який повинен відповідати будь-якій рядку, включаючи нульову рядок.
Однак, вони не відповідають ім’ям файлів, починаючи з, .
якщо не встановлено параметр оболонки dotglob
.
Під час використання *.*
він відповідає будь-якому:
.
.
Також ви можете звернутися до Розширення імені файлів у посібнику.
Багато людей, які приїжджають з Windows, думають, що *.*
це для всіх файлів. У Windows це так. У UNIX усі файли містять принаймні 1 крапку у своєму імені. *
сам по собі працює чудово в Windows (датується повністю до раннього DOS); однак старі підручники, опубліковані, *.*
і, здається, важко звикнути зламати.
*
являє собою підстановку, яка використовується оболонкою для розширення імені файлу , також відома як "глобулінг". *
розширюється на що завгодно, включаючи нічого (наприклад, *.*
буде відповідати file.
тощо). Інший загальний підстановочний знак ?
, який відповідає будь-якому одному символу.
Не плутайте функцію цих символів із використанням одних і тих же символів у регулярних виразах (наприклад, тих, що використовуються з грепом).
Це зірка-точка-зірка - принаймні, у світі DOS (а пізніше, звичайно, Windows). У DOS крапка .
має особливе магічне значення, оскільки назви файлів - це восьми символьна база (пізніше розширена, але давайте залишимось старою школою) та трисимвольне розширення (яке визначало тип файлу). У Unix тип файлу зазвичай визначається першими двома байтами файлу (або іншою магією), а розширення є інформативним, але не має великого значення. За винятком випадків, коли це все розмилося.
Отже, в Unix особливого значення немає. Зірочка є символом "глобінгу" в оболонках Unix і є символом для будь-якої кількості символів (включаючи нуль). ?
- це ще один загальний глобальний персонаж, що відповідає точно одному з будь-яких символів.
*.*
відповідає будь-яким іменам, які містять принаймні одне .
. Він не має спеціального імені або якогось значення, більш ніж *a*
або *_*
. І *.?
відповідатиме будь-яким файлам із крапкою та точно одним символом після цієї крапки. Існують також кілька складніших моделей розширеного глобулювання - дивіться сторінку чоловіка вашої оболонки.
"Словник нового хакера" (розширення старого файлу "Жаргон" MIT) зазначає, що "зірка" є найпоширенішою назвою для цього *
символу (далі 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.*
, отримуйте всі файли, останнім символом яких перед розширенням є a7
, і з*sa*
, я отримую всі файли, що містять підрядку вsa
будь-якому місці імені файлу тощо. (Відповідно, стаття, яку ви цитуєте, має назву Як працювали підстановки в MS-DOS ? (Наголос додав я сам).