O que é Globbing?
É o processo de expansão de nomes realizado pelo bash.
Bash é um shell, ou seja, um interpretador de comandos. Provavelmente, a telinha preta que você usa no Linux está usando o bash para interpretar os comandos ls, date, pwd…
Um exemplo de expansão de nomes ou globbing é “bol?” que pode ser expandido para “bola”, “bolo” já que a interrogação substitui algum outro caractere qualquer.
Gobbling e Expressões Regulares São Diferentes
Para entendermos Globbing temos que saber primeiro que Expressões regulares não tem relação com gobbling.
Expressões Regulares são muito mais complexas que a expansão de nomes feito pelo Bash.
Expressões Regulares são conjuntos de caracteres que se casam/combinam com padrões. Exemplo, o caractere asterisco * é em expressões regulares significa zero ou mais vezes. Então “bol*a” combina com palavras que entre começam com “bol” e terminam com “a”; como “bolacha”, borracha ou até mesmo “bola” já que o asterisco representa zero ou mais vezes então “bol*” pode representar “bola”.
Além do asterisco * temos outros caracteres especias em expressões regulares, como a interrogação ?, o ponto . e o sinal do dolar $
Globbing no Bash
Bash não trabalha com Expressões Regulares. Bash trabalha com Expansão de nomes de arquivos usando para isso wild cards como ?, *, []
Por favor, não confunda os wild cards “? * []” com os caracteres das expressões regulares. Por mais que sejam os mesmos símbolos eles possuem significados diferentes!
Por favor mais uma vez 🙂 , não entender errado quando informado que o bash não trabalha com expressões regulares e você ver alguém usando expressões regulares no bash. Sim, alguns programas usados no bash como grep, locate, sed, awk usam Expressões Regulares, mas não o bash em si.
Wild Cards Comuns
- * = Asterisco representa zero ou mais caracteres
- ? = Representa um único caractere
- [] = Representa uma série de caracteres.
Expandindo os Nomes de Arquivos no Bash com Gobbling
- Listando todo o conteúdo da pasta com ls
[elder@centos65 pasta_de_arquivos]$ ls -l total 0 -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:26 lista_compras.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_enderecos.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_nomes.txt
- Listanado apenas nomes de arquivos que iniciam com “arq”
[elder@centos65 pasta_de_arquivos]$ ls -l arq* -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt
- Listando nomes começados com list
[elder@centos65 pasta_de_arquivos]$ ls -l lis* -rw-rw-r-- 1 elder elder 0 Out 9 11:26 lista_compras.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_enderecos.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_nomes.txt
- Listando nomes que possuem um caractere entre “arquivo0” e “.txt”
[elder@centos65 pasta_de_arquivos]$ ls -l arquivo0?.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt
- Listando arquivos que terminal com a extensão “.txt”
[elder@centos65 pasta_de_arquivos]$ ls -l *.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:26 lista_compras.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_enderecos.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_nomes.txt
- Listando arquivos que contém 0,1 2, 3 ou 4 em seus nomes
[elder@centos65 pasta_de_arquivos]$ ls -l *[0-4]* -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt
- Listando nomes de arquivos com 3 ou 2 em seus nomes
[elder@centos65 pasta_de_arquivos]$ ls -l *[3,2]* -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt
- Criando os arquivos “1.txt” e “3.txt” arquivos de um única vez
[elder@centos65 pasta_de_arquivos]$ touch {1,3}.txt [elder@centos65 pasta_de_arquivos]$ ls -l total 0 -rw-rw-r-- 1 elder elder 0 Out 9 11:45 1.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:45 3.txt
- Criando arquivos “4.txt, 5.txt, 6.txt até o 20.txt”
[elder@centos65 pasta_de_arquivos]$ touch {4..20}.txt [elder@centos65 pasta_de_arquivos]$ ls -l total 0 -rw-rw-r-- 1 elder elder 0 Out 9 11:53 10.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 11.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 12.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 13.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 14.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 15.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 16.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 17.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 18.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 19.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:52 1.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 20.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:45 3.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 4.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 5.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 6.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 7.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 8.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 9.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:26 lista_compras.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_enderecos.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_nomes.txt
- Excluindo todo arquivo que possui “um número + .txt”
[elder@centos65 pasta_de_arquivos]$ rm [[:digit:]].txt
[elder@centos65 pasta_de_arquivos]$ ls -l total 0 -rw-rw-r-- 1 elder elder 0 Out 9 11:53 10.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 11.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 12.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 13.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 14.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 15.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 16.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 17.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 18.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 19.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:53 20.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:26 lista_compras.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_enderecos.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_nomes.txt
- Excluindo todo arquivo que possui “dois número + .txt”
[elder@centos65 pasta_de_arquivos]$ rm [[:digit:]][[:digit:]].txt [elder@centos65 pasta_de_arquivos]$ ls -l total 0 -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo01.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo02.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 arquivo03.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:26 lista_compras.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_enderecos.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_nomes.txt
- Excluindo arquivos que possuem 9 caracteres e finalizam com .txt
[elder@centos65 pasta_de_arquivos]$ rm ?????????.txt [elder@centos65 pasta_de_arquivos]$ ls -l total 0 -rw-rw-r-- 1 elder elder 0 Out 9 11:26 lista_compras.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_enderecos.txt -rw-rw-r-- 1 elder elder 0 Out 9 11:25 lista_nomes.txt
Desabilitando e Ativando Globbing no Bash
Por padrão a expansão de nomes vem ativada no bash. Para desativar basta usar “set -f” para ativar use “set +f”
- Desabilitando Expansão de nomes no bash
[elder@centos65 pasta_de_arquivos]$ set -f
- Tentando excluir todo arquivo começado com “lista”
[elder@centos65 pasta_de_arquivos]$ rm lista* rm: não foi possível remover "lista*": Arquivo ou diretório não encontrado
O arquivo não foi encontrado porque globbing está desativado
- Ativando Gobbling
[elder@centos65 pasta_de_arquivos]$ set +f
- Novamente tentando excluir todo arquivo começado com “lista”
[elder@centos65 pasta_de_arquivos]$ rm lista*
- Não restoum um arquivozinho sequer para contar história 🙂
[elder@centos65 pasta_de_arquivos]$ ls -l total 0
One Comment to “Globbing ou Expansão de Nomes de Arquivos”