glob

GLOB(7)                    Manual do Programador Linux                   GLOB(7)



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)



Unix                               12/06/1998                            GLOB(7)