O guia globbing do Linux que todo usuário de linha de comando deve ler

Globbing é como expressões regulares para seus nomes de arquivos. Infelizmente, muitas vezes é mal compreendido, apesar de ser uma habilidade essencial de linha de comando sobre a qual todos sabem pelo menos alguma coisa. Transforme esse conhecimento superficial em uma melhor compreensão.

O que é globulação?

“Globbing” é uma versão informal do termo “expansão de nome de arquivo”. Usando padrões especiais, você pode identificar nomes de arquivos com base em padrões, em vez de correspondências literais exatas.

O primeiro exemplo de globbing que todo mundo encontra está neste tipo de formato:

ls *.txt

Isso mostra uma lista de arquivos com nomes que terminam na extensão “.txt” em seu diretório atual. Neste exemplo, o * corresponde a qualquer string, incluindo nenhuma, portanto corresponderia a arquivos com estes nomes:

  • sobre.txt
  • um nome de arquivo com espaços.txt

Não corresponderia:

  • arquivo.txt.gz
  • .TXT

Arquivos ocultos começando com . são um caso especial. Para combinar arquivos ocultos, você deve começar seu padrão com “.” personagem.

Existem apenas dois outros tipos de correspondência no caso padrão. O ? padrão corresponde a qualquer caractere: um exatamente. E o […] padrão corresponde a um único caractere do conjunto fechado, que também pode incluir intervalos (como az) e classes de personagens (como :dígito:).

Com apenas essas regras, você pode construir padrões bastante sofisticados para combinar diferentes conjuntos de arquivos, de acordo com suas necessidades. Então, por exemplo, você poderia usar eu [amz]*[:digit:].?? Para mostrar todos os arquivos que começam com a, m ou z e terminam com um dígito seguido por um ponto e uma extensão de exatamente duas letras.

Às vezes você pode ver um padrão envolvendo colchetes, como é *. {md, redução}que lista todos os arquivos que terminam em qualquer extensão. Tecnicamente, essa expansão de suporte é separada do processo de globbing, mas é comum usar os dois juntos.

Como funciona o globing?

Globbing é controlado pelo seu shell, não pelo comando que você está executando. Considere o que acontece quando você corre é *.txt. Você pode pensar que o programa ls recebe “*.txt” como argumento, descobre quais arquivos esse padrão corresponde e imprime os resultados.

Na verdade, o shell é responsável por transformar “*.txt” em “foo.txt”, “hello.txt” etc. Em seguida, ele passa esses valores para o comando ls como argumentos. Portanto, ls nunca precisa se preocupar em lidar com “*.txt”; o shell lida com isso.

Esta é a causa de um problema comum com comandos como find:

find . -name *.txt

Ao executar este comando, você esperaria que find localizasse todos os arquivos de texto no diretório atual e todos os seus subdiretórios. No entanto, em vez disso, Bash faz o seguinte:

  • Vê o “*” e converte “*.txt” em uma lista de nomes de arquivos correspondentes, que serão todos apenas do diretório atual.
  • Executa o comando, por exemplo, encontrar . -nome arquivoa.txt arquivob.txt arquivoc.txt.

Confirme o comando que seu shell realmente executará antecipadamente, prefixando-o com echo:

O problema agora é que find reclamará de um “principal ou operador desconhecido”; e você provavelmente ficará coçando a cabeça tentando descobrir o que isso significa!

A opção -name (find chama isso de “primário”) só pode receber um argumento, então find fica confuso quando vê “fileb.txt” e bails. A maneira correta de executar este comando é:

find . -name '*.txt'

Colocar a expressão entre aspas simples ou duplas significa que o shell não realizará a expansão do nome do arquivo, passando o padrão para find.

O que mais o globbing pode fazer?

No Bash, os principais caracteres globais são *,? […]. No entanto, o Bash oferece suporte a um conjunto estendido de curingas com mais funcionalidades. Isso serve principalmente para suportar padrões repetidos e aproximar o globbing da correspondência completa de expressões regulares.

O globbing estendido geralmente é habilitado por padrão, mas se não estiver (por exemplo, no Bash 3.2 no macOS), você precisará fazer isso com este comando:

shopt -s extglob

Depois de ativado, você poderá usar o seguinte:

  • ?(lista de padrões) para corresponder a 0 ou 1 ocorrência dos padrões fornecidos.
  • *(lista de padrões) para corresponder a 0 ou mais ocorrências dos padrões fornecidos.
  • +(lista de padrões) para corresponder a 1 ou mais ocorrências dos padrões fornecidos.
  • @(pattern-list) para corresponder a 1 dos padrões fornecidos.
  • !(lista de padrões) para corresponder a qualquer coisa, exceto um dos padrões fornecidos.

Por exemplo, você pode combinar arquivos chamados “a”, “aa” e “aaaaa” com o glob +(a). Você pode combinar os arquivos “README.md”, “README.txt” e “README” com o padrão LEIA-ME?(.md|.txt).

Se você estiver familiarizado com expressões regulares, é fácil esquecer que os globs estão implicitamente ancorados. Isso significa que um padrão como +(a) corresponderá apenas a arquivos que consistem apenas no caractere “a”, em vez de qualquer arquivo que contenha pelo menos um caractere “a” em algum lugar no meio.

Como o globbing é controlado pelo seu shell, a sintaxe que ele suporta pode variar, portanto você deve sempre verificar a documentação do seu shell. O shell Zsh também suporta o básico, mas oferece uma sintaxe estendida que está mais próxima das expressões regulares. Por exemplo, Zsh suporta agrupamento com parênteses, que é semelhante à sintaxe estendida do Bash:

ls (file1|file2)  # ls file1 file2

Muitos shells, incluindo Bash e Zsh, adicionam um recurso de globbing recursivo, onde você pode expandir as correspondências de arquivos recursivamente. Usando isso, você pode combinar zero ou mais diretórios com o padrão **. Então ls **/*.txt encontrará todos os arquivos .txt dentro do diretório atual ou qualquer um de seus subdiretórios, em qualquer profundidade:

No Bash, esta é outra configuração opcional do shell, então você precisará habilitá-la:

shopt -s globstar

Vale a pena dominar a sintaxe principal compatível com POSIX para globbing: ?, * e […]. Com esses padrões, você será capaz de lidar com grupos de arquivos de forma eficiente, economizando um precioso esforço de digitação. Se você estiver comprometido com um shell específico, receberá um pequeno bônus ao aprender sua sintaxe estendida.

Este artigo foi útil?
Gostei0Não Gostei0

Related posts

Uma VPN realmente deixa sua internet mais lenta? Eu medi isso

Proton agora tem um clone do Planilhas Google com criptografia ponta a ponta

A Pesquisa Google está empurrando mais pessoas para o modo AI