Відповіді:
Ім'я файлів оболонки в глобусі та регулярні вирази використовують одні й ті ж символи, і вони мають подібні цілі, але ви праві, вони не сумісні. Ім'я файлів - це набагато менш потужна система.
У глобальному імені файлу:
* означає "нуль або більше символів"
? означає "будь-який єдиний символ"
Але в регулярних виразах ви повинні використовувати, .*щоб означати "нуль або більше символів", і .означає "будь-який один символ". A ?означає щось різне в регулярних виразах: нуль або один екземпляр попереднього елемента RE.
Квадратні дужки ( []), здається, працюють однаково в обох системах системи, на якій я набираю це, принаймні для простих випадків. Сюди входять такі речі, як класи символів POSIX (наприклад [:alpha:]). Це означає, що якщо вам потрібні ваші команди для роботи над багатьма різними типами системи, я рекомендую не використовувати нічого, крім елементарних речей, таких як списки символів (наприклад [abeq]) та, можливо, діапазони символів (наприклад [a-c]).
Ці відмінності означають, що дві системи є взаємозамінними лише для простих випадків. Якщо вам потрібна відповідність імен файлів з регулярними виразами, потрібно зробити це іншим способом. find -regexє одним із варіантів. (Зверніть увагу, що існує find -name, до речі, і синтаксис, що використовує глобус.)
'%'означає '*'.
Відповідаючи на питання, висловлене в оригінальній назві:
Чому регулярні вирази відрізняються від тих, які використовуються для фільтрації файлів?
Розширення імені файлів передує регулярним виразам, які вже існували в більшості операційних систем (символи підстановки / джокер) та набагато простіші та інтуїтивніші, ніж останні.
Хоча *.txtвипадкові користувачі легко зрозумілі, аналог .*\.txt- це щось більш націлене на досвідчених користувачів / програмістів, не кажучи вже про ^.*\.txt$...
*.txtне дорівнює .*\.txt, вона (в основному) дорівнює .*\.txt$тому, що після .txt(принаймні, якщо розумне глобальне ім'я файлу) не може бути нічого . Можливо, навіть ^.*\.txt$дещо залежно від використання. Доводить свою думку?