Há muito tempo, nessa mesma lista o Tiago Peczenyj (PacMan) deu uma dica
sobre extglob que adaptei para meu livro. Veja:
Estendendo pesquisa de arquivos pelo nome
O *Shell *possui, além do *globbing* normal - que são os curingas
conhecidos por todos para expansão de nomes de arquivos e diretórios (*, ? e
[a-z]) - um *globbing* estendido. Este *globbing* estendido, em alguns
casos, poderá ser muito útil e sempre será mais veloz que o código que ele
substituirá, como o pipe junto com o grep. (normalmente se faria ls
<ESCOPO> | grep ... ou echo <ESCOPO> | grep ...)
Nas linhas a seguir, LISTA contém um ou mais padrões separados por uma
barra vertical (|), que, diga-se de passagem, é tratada como um OU lógico
em *Expressões Regulares* e em diversos comandos que em sua sintaxe aceitam
a formação de padrões de pesquisa usando os caracteres coringa (como o
comando case, por exemplo). Veja:
-
Casa zero ou uma ocorrência de LISTA.
*?(LISTA)*
-
Casa zero ou mais ocorrências de LISTA (exatamente como uma *Express**ão**
Regular*).
**(LISTA)*
-
Casa uma ou mais ocorrências de LISTA (exatamente como uma *Express**ão**
Regular*).
*+(LISTA)*
-
Casa com exatamente uma ocorrência de LISTA.
*@(LISTA)*
-
Casa com qualquer coisa, exceto com LISTA (A exclamação (!) em diversos
comandos (como exemplo o ls) é tratado como negação).
*!(LISTA)*
Para poder utilizá-los precisa executar o comando shopt conforme o exemplo
a seguir:
*$ shopt -s extglob*
*$ ls arq**
arq arqdados arqdadosdados arqutils
*$ ls arq?(dados)*
arq arqdados
*$ ls arq*(dados)*
arq arqdados arqdadosdados
*$ ls arq+(dados)*
arqdados arqdadosdados
*$ ls arq@(dados)*
arqdados
*$ ls arq!(dados) **Divertido esse*
arq arqdadosdados arqutils
*$ ls arq+(dados|utils)*
arqdados arqdadosdados arqutils
*$ ls arq@(dados|utils) **O mesmo que ls arq {dados,utils}*
arqdados arqutils
Obrigado, Tiago Peczenyj!
O Tiago me deu as dicas anteriores, mas existem outras... teste as <opcoes> a
seguir dentro do comando shopt -s <opcoes>.
cdspell
Com essa opção ativada, pequenos erros de digitação no nome do diretório
para o qual você deseja fazer um cd serão ignorados, isto é, caracteres
extras ou esquecidos serão automaticamente corrigidos sem necessidade de
redigitação.
No exemplo a seguir, queria fazer um cd rede, que é um diretório abaixo do
meu *home*.
*$ cd red*
bash: cd: red: Arquivo ou diretório inexistente
*$ shopt -s cdspell*
*$ cd red*
rede
*$ cd -*
/home/jneves
*$ cd ede*
rede
*$ cd -*
/home/jneves
*$ cd redes*
rede
Já viu que essa é uma boa opção para você ter no seu .bashrc, não é?
cmdhist
Essa opção é bacana, pois transforma comandos criados em diversas linhas
(como um for ou um while, por exemplo) em uma única linha, com os comandos
separados por ponto e vÃrgula (;). Isso é particularmente útil para editar
comandos e reaproveitá-los do history, sendo portanto é uma opção ativada
por *default* pelo *bash*.
dotglob
Essa opção permite que nomes de arquivos começados por um ponto (.), conhecidos
como âarquivos escondidosâ, sejam expandidos com os metacaracteres curinga.
*$ ls *bash* *
ls: impossÃvel acessar *bash*: Arquivo ou diretório inexistente
*$ shopt -s dotglob*
*$ ls *bash**
..bash_history .bash_logout .bashrc
Abraços,
Julio
*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» **Conheça nosso portal educacional e estude conosco: *
* http://www.dicas-l.com.br/cursos/educacao
<http://www.dicas-l.com.br/cursos/educacao>*
*» Treinamento presencial (em 4 sábados) no RJ e BSB *
* em http://bit.ly/cursoshelljulioneves
<http://bit.ly/cursoshelljulioneves> *
*Também damos treinamento em sua empresa*
*em qualquer cidade**, **com certificado **e nota fiscal.*
Nosso time de instrutores *in company* é formado somente por
autores
de
*Best Sellers *laureados sobre os temas. P. exemplo:
Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
Em dom, 12 de ago de 2018 Ã s 19:02, Tiago Tarifa Munhoz
Post by Tiago Tarifa Munhoz ***@gmail.com [shell-script]Acertou em cheio Paulo.
Eu estava testando no meu trabalho com o OpenSuSE 15, mas em casa uso o
Gentoo e deu o mesmo problema.
Depois que ativei a opção extglob da forma como você descreveu, o
problema parou de ocorrer.
Algo que ainda não entendo muito são os parâmetros do Bash.. Com certeza
é algo que preciso parar para dar uma boa lida.
/*extglob*//: If set, the extended pattern matching features described
above under //*Pathname Expansion*//are enabled. /(Era exatamente o que
eu precisava)
Obrigado a todos.
Post by ***@yahoo.com.br [shell-script]Olá Tiago, tive o mesmo resultado aqui. Na linha de comando funciona,
num script não.
Parece ser a opção extglob ligada ou não. Pelo jeito depende da distro.
Eu ligo no .bash_profile, mas no ambiente do script a opção fica desligada.
Experimente colocar 'shopt -s extglob' no inÃcio do script.
Abraços Paulo
Post by Tiago Tarifa Munhoz ***@gmail.com [shell-script]Cara, não deu certo sua dica... mesmo erro. Mas obrigado.
Funcionou certinho. Muito obrigado!
Agora fica a dúvida do porque o comando que citei não funciona em um
script e em linha de comando funciona....
Post by Tiago Tarifa Munhoz ***@gmail.com [shell-script]Em sex, 10 de ago de 2018 Ã s 14:46, ë¹ ë Leonardo Goretti
__
Tenta
du -hsx --exclude=/{proc,sys,dev} /*
Em sex, 10 de ago de 2018 Ã s 14:32, Tiago Tarifa Munhoz
__
Pessoal,
estou fazendo um script que coleta o tamanho dos diretórios na raiz.
Porém não quero colocar alguns
Post by Tiago Tarifa Munhoz ***@gmail.com [shell-script]deles como: /proc, /sys, /dev
du -sh /!(proc|sys|dev)
./teste.sh: line 9: syntax error near unexpected token `('
./teste.sh: line 9: `du -sh /!(proc|sys|dev)'
porém se eu executar o mesmo comando direto no shell funciona.
Há poderia dar algum pitaco nesse problema?
versão do bash: GNU bash, version 4.4.19(1)-release
(x86_64-suse-linux-gnu)
Post by Tiago Tarifa Munhoz ***@gmail.com [shell-script]--
Leonardo Goretti
Gerência e Operações
Analista de infraestrutura - GNU/LINUX
Instrutor GNU/LINUX
Itil V3
Celular: +55 (61) 97402-3166
U2Ugdm9jw6ogZGVjcnlwdG91IMOpIHBvciBxdWUgc2FiZSBkYXMgY29pc2FzCg==
----------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
Responder através da web