Expressões regulares e globbing de nome de arquivo são duas coisas muito diferentes.
Expressões regulares são usadas em comandos / funções para correspondência de padrões no texto. Por exemplo, no parâmetro padrão de grep
, ou nas linguagens de programação.
O globbing do nome do arquivo é usado pelos shells para combinar nomes de arquivos e diretórios usando curingas. As capacidades de globbing dependem da casca. O Bash, por exemplo, suporta caracteres curinga como:
*
corresponde a 0 ou mais caracteres
?
corresponder 1 caractere
[...]
corresponde a um caractere no conjunto especificado
Esses curingas podem parecer semelhantes às expressões regulares e, na verdade, [...]
têm o mesmo significado em globbing e regex. Mas *
e ?
significa coisas diferentes em globbing e regex.
Em um comentário que você escreveu:
mas como a diferença do intérprete * seja um coringa ou uma expressão regular? por exemplo grep a*b a*.txt
:?
Fácil. Tipo de.
Primeiro, o shell tenta interpretar os curingas, combinando-os com os nomes de arquivos. Se houver arquivos começando com "a" e terminando com "b", o shell será substituído a*b
pelos nomes de arquivos correspondentes. O mesmo vale para a*.txt
. Se não houver nomes de arquivos correspondentes, o shell transmitirá os argumentos grep
como eram, literalmente.
No entanto, o primeiro parâmetro de grep
deve ser um padrão. Em 99,999% dos casos de uso prático, você não deseja que o primeiro parâmetro seja interpretado pelo shell. Então, provavelmente, a intenção era esta:
grep "a*b" a*.txt
Graças à citação a*b
, o shell não o interpretará usando globbing e, em vez disso, o passará diretamente para grep
. Por sua vez, grep
interpretará isso como uma expressão regular (por design).
Para resumir, o shell interpreta a linha de comando seguindo sua própria linguagem globbing, que está usando caracteres curinga. Comandos, programas interpretam seus parâmetros da maneira que foram projetados por seus autores.
find ./ -name 'a*'
use * como um curinga. Ao digitarfind ./ -regex 'a*'
, você usa * em uma regex. A diferença importante é a troca-name
ou-regex
.