Provided by:
manpages-pt_20040726-2_all 
NOME
glob - Caminhos de diretórios de englobamento
DESCRIÇÃO
Muito tempo atrás, no Unix V6, havia um programa /etc/glob que poderia
expandir os padrões de coringas. Logo em seguida, isso se tornaria
embutido no interpretador de comandos.
Nos dias de hoje, também há uma rotina de biblioteca glob(3) que
realizará esta função para um programa de usuário.
As regras são as que seguem (POSIX 1003.2, 3.13).
CASAMENTO DE CORINGAS
Uma cadeia de caracteres é um padrão de coringas se contiver um ou mais
caracteres ‘?’, ‘*’ ou ‘[’. Englobamento é a operação que expande um
padrão de coringas para uma lista de nomes de caminhos que casam com o
padrão. Casamento é definido por:
Um ‘?’ (não entre colchetes) casa com qualquer caractere unitário.
Um ‘*’ (não entre colchetes) casa com qualquer string, incluindo uma
cadeia de caracteres vazia.
Classes de caracteres
Uma expressão ‘[...]’ onde o primeiro caractere depois do primeiro ‘[’
não é um ‘!’ que casa com um caractere unitário, desde que seja um dos
caracteres de dentro dos colchetes. A string cercada pelos colchetes
não pode estar vazia: portanto ‘]’ é um caractere permitido entre os
colchetes, desde que seja o primeiro caractere. Portanto, ‘[][!]’ casa
com os três caracteres ‘[’, ‘]’ e ‘!’.)
Faixas
Há uma convenção especial: dois caracteres separados por ‘-’ denotam
uma faixa. (Portanto, ‘[A-Fa-f0-9]’ é equivalente a
‘[ABCDEFabcdef0123456789]’.) É possível incluir ‘-’ com seu
significado literal ao colocá-lo em primeiro ou em último entre os
caracteres dentro dos colchetes. (Portanto, ‘[]-]’ casa apenas com os
dois caracteres ‘]’ e ‘-’, e ‘[--/]’ casa com os três caracteres ‘-’,
‘.’, ‘/’.)
Complementação
Uma expressão ‘[!...]’ casa com um caractere unitário, desde que seja
um caractere não presente na expressão obtida pela remoção do primeiro
‘!’. (Portanto, ‘[!]a-]’ casa com qualquer caractere unitário, exceto
‘]’, ‘a’ e ‘-’.)
É possível remover o significado especial de ‘?’, ‘*’ e ‘[’ precedendo-
os por uma barra invertida, ou, caso seja parte de uma linha de comando
do shell, cercando-os com aspas. Entre colchetes, estes caracteres
respondem por eles mesmos. Portanto, ‘[[?*\]’ casa com os quatro
caracteres ‘[’, ‘?’, ‘*’ e ‘\’.
NOMES DE CAMINHOS
Englobamento é a aplicação de cada um dos componentes de um nome de
caminho separadamente. Um ‘/’ em um nome de caminho não pode casar com
um coringa ‘?’ ou ‘*’, ou com uma faixa como ‘[.-0]’. Uma faixa não
pode conter um caractere ‘/’ explícito; isto levaria a um erro de
sintaxe.
Se um nome de arquivo começa com um ‘.’, este caractere deve ser casado
explicitamente. (Portanto, ‘rm *’ não removerá .profile, e ‘tar c *’
não arquivará todos os seus arquivos: ‘tar c .’ é melhor.)
LISTAS VAZIAS
A bela e simples regra dada acima: ‘expanda um padrão de coringas na
lista de caminhos de diretório de casamento’ foi a definição padrão do
Unix. Ela permite padrões que se expandam para uma lista vazia, como em
xv -wait 0 *.gif *.jpg
onde talvez nenhum arquivo *.gif esteja presente (e isto não é um
erro). Porém, o POSIX requer que um padrão de coringas seja deixado
inalterado quando estiver sintaticamente incorreto, ou a lista de nomes
de caminhos esteja vazia. Com bash pode-se forçar o comportamento
clássico, setando-se allow_null_glob_expansion=true.
(Problemas similares ocorrem em toda a parte. Por exemplo, onde há em
scripts antigos
rm ‘find . -name "*~"‘
os novos scripts requerem
rm -f nosuchfile ‘find . -name "*~"‘
para evitar mensagens de erro de rm chamado com uma lista de argumentos
vazia.)
NOTAS
Expressões regulares
Note que padrões de coringas não são expressões regulares, apesar de
que são um pouco similares. Primeiramente, eles casam com nomes de
arquivos em vez de texto, e em segundo lugar, as convenções não são as
mesmas: por exemplo, em uma expressão regular ‘*’ significa zero ou
mais cópias da coisa precedente.
Agora que as expressões regulares têm expressões com colchetes, onde a
negação é indicada por um ‘^’, o POSIX declarou que o efeito de um
padrão de coringa ‘[^...]’ é indefinido.
Classes de caracteres e Internationalização
Obviamente, faixas significavam originalmente as faixas ASCII, de forma
que ‘[ -%]’ significa ‘[ !"#$%]’ e ‘[a-z]’ significa "qualquer letra
minúscula". Algumas implementações Unix generalizaram isso, de tal
forma que que uma faixa X-Y significa o conjunto de caracteres com
código entre o código de X e o de Y. Porém, isso requer que o usuário
saiba o código do caractere em uso no sistema local, e além disso, não
é conveniente se a seqüência de conferência para o alfabeto local
difere da ordenação dos códigos de caractere. Portanto, POSIX estendeu
grandemente a notação de colchetes, tanto nos padrões de coringas
quanto nas expressões regulares. Anteriormente, nós vimos três tipos
de itens que podem ocorrer em uma expressão em colchetes: (i) a
negação, (ii) caracteres unitários explicitados e (iii) faixas. POSIX
especifica faixas de uma forma internacionalmente mais útil, e
acrescenta mais três tipos:
(iv) Faixas X-Y compreendem todos os caractees que caem entre X e Y
(inclusive) na seqüência de conferência corrente, como definido pela
categoria LC_COLLATE no locale corrente.
(iv) Classes nomeadas de caracteres, como
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
, de forma que se pode dizer ‘[[:lower:]]’ (minúsculo) em vez de ‘[a-
z]’, e funciona na Dinamarca também, onde há três letras depois do ‘z’
no alfabeto. Essas classes de caracteres são definidas pela categoria
LC_CTYPE na localização atual.
(v) Símbolos de conferência, como ‘[.ch.]’ ou ‘[.a-acute.]’, onde a
string entre ‘[.’ e ‘.]’ é um elemento de conferência definido na
localização atual. Note que este pode ser um elemento multi-caractere.
(vi) Expressões de classes de equivalência, como ‘[=a=]’, onde a string
entre ‘[=’ e ‘=]’ é um elemento de conferência qualquer da sua classe
de equivalência, como é definido no locale corrente. Por exemplo,
‘[[=a=]]’ deve ser equivalente a ‘[aáàäâ]’ (cuidado: Latin-1 aqui), ou
seja, a ‘[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]’.
VEJA TAMBÉM
sh(1), glob(3), fnmatch(3), locale(7), regex(7)
TRADUZIDO POR LDP-BR em 21/08/2000.
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução) André L.
Fassone Canova <lonelywolf@blv.com.br> (revisão)