Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Extended Globbing

Não sei se é conhecimento de todos mas o Bash possui, alem do globbing normal (a expansão * ? e [a-z] de nomes de arquivos e diretórios), um globbing extendido.

Acho que, em alguns casos, podera ser BEM util, eliminando um pipe para um grep por exemplo.

São eles (direto do man)
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches exactly one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns

Para poder utiliza-lo precisa executar o shopt conforme o exemplo abaixo

$ shopt -s extglob

$ ls
file filename filenamename fileutils

$ ls file?(name) # padrão pode aparecer 0 a 1 vezes

file filename

$ ls file*(name) # padrão pode aparecer 0 a N vezes
file filename filenamename

$ ls file+(name) # padrão pode aparecer 1 a N vezes
filename filenamename

$ ls file@(name) # padrão deve aparecer 1 unica vez
filename

$ ls file!(name) # divertido esse! padrão NÃO deve aparecer
file filenamename fileutils

$ ls file+(name|utils) # cada padrão pode aparecer 1 a N vezes
filename filenamename fileutils

$ ls file@(name|utils) # "lembra" um file{name,utils} ;-)
filename fileutils

Comments

Tiago Peczenyj
Para um administrador é interessante saber as opções huponexit e restricted_shell – e depois dizem que o shell é complicado.

Po é cada coisa util que tem :)
NetWalker
Hail again Peczenyj. :)
Esse recurso extended globbing realmente é uma mão-na-roda. Isso sem falar em outros built-in do shell acessíveis pelo shopt. Lembrei de um comum q alguns odeiam, e tem quem goste: o cdspell; e mesmo o cmdhist.
No mais vale lembrar, pra quem visita, o óbvio desses globbings, q é um globbing poder “englobbar” outro. :P
Assim sendo: ls file!(+(name))
Eliminando qualquer ocorrência de name.
Até +.

NetWalker