Respostas:
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 especificadoEsses 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.
Se um nome de arquivo for uma sequência para você, você poderá usar regex também para nomes de arquivos. Por exemplo: se você deseja encontrar nomes de arquivos correspondentes a um regex, tente:
find ./ -regex '.*[abc][xyz].*'
O comando procura por arquivos que tenham a, b ou c no nome, seguidos por x, y ou z. isso é apenas um exemplo. Existem infinitas possibilidades.
find ./ -name 'a*'
use * como um curinga. Ao digitar find ./ -regex 'a*'
, você usa * em uma regex. A diferença importante é a troca -name
ou -regex
.