Respostas:
O globbing do nome do arquivo do shell e as expressões regulares usam alguns dos mesmos caracteres, e eles têm finalidades semelhantes, mas você está certo, eles não são compatíveis. O globbing de nome de arquivo é um sistema muito menos poderoso.
No nome do arquivo globbing:
*
significa "zero ou mais caracteres"
?
significa "qualquer caractere único"
Mas nas expressões regulares, você deve usar .*
para significar "zero ou mais caracteres" e .
significa "qualquer caractere único". A ?
significa algo bem diferente nas expressões regulares: zero ou uma instância do elemento RE anterior.
Os colchetes ( []
) parecem funcionar da mesma forma nos dois sistemas no sistema em que estou digitando isso, pelo menos em casos simples. Isso inclui coisas como classes de caracteres POSIX (por exemplo [:alpha:]
). Dito isto, se você precisar que seus comandos funcionem em muitos tipos diferentes de sistemas, recomendo não usar nada além de coisas básicas, como listas de caracteres (por exemplo [abeq]
) e talvez intervalos de caracteres (por exemplo [a-c]
).
Essas diferenças significam que os dois sistemas são apenas intercambiáveis diretamente para casos simples. Se você precisar de correspondência regex de nomes de arquivo, precisará fazê-lo de outra maneira. find -regex
é uma opção. (Observe que também há find -name
, a propósito, que usa sintaxe glob.)
'%'
os meios '*'
.
Respondendo à pergunta expressa no título original:
Por que as expressões regulares diferem das usadas para filtrar arquivos?
A expansão do nome do arquivo é anterior às expressões regulares, já existia na maioria dos sistemas operacionais (caracteres curinga / coringa) e é muito mais simples e intuitiva que a última.
Embora *.txt
seja facilmente compreensível por usuários casuais, o análogo .*\.txt
é algo mais direcionado a usuários / programadores experientes, sem mencionar ^.*\.txt$
...
*.txt
não é igual .*\.txt
, é (principalmente) igual a .*\.txt$
porque não pode haver nada após o .txt
(pelo menos assumindo um nome razoável do arquivo). Talvez até ^.*\.txt$
um pouco, dependendo do uso. Prova o seu ponto?