|
From: | Julio C. Neves |
Subject: | Re: [shell-script] pattern match no bash |
Date: | Mon, 13 Aug 2018 11:07:57 -0300 |
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 é?
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.
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
Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
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.
Para quem não sabe também, no manual a opção extglob diz o seguinte:
/*extglob*//: If set, the extended pattern matching features described
above under //*Pathname Expansion*//are enabled. /(Era exatamente o que
eu precisava)
Obrigado a todos.
address@hidden [shell-script] wrote:
>
>
> 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
>
> On 8/10/18 3:43 PM, Tiago Tarifa Munhoz address@hidden
> [shell-script] wrote:
> >
> > Vinicius Costa Carvalho:
> >
> > Cara, não deu certo sua dica... mesmo erro. Mas obrigado.
> >
> >
> > Leonardo Goretti:
> >
> > 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....
> >
> >
> > Em sex, 10 de ago de 2018 às 14:46, 빠는 Leonardo Goretti
> address@hidden
> > <mailto:address@hidden> [shell-script]
> <address@hidden
> > <mailto:address@hidden>> escreveu:
> >
> > __
> >
> > Tenta
> >
> > du -hsx --exclude=/{proc,sys,dev} /*
> >
> > Em sex, 10 de ago de 2018 às 14:32, Tiago Tarifa Munhoz
> address@hidden
> > <mailto:address@hidden> [shell-script]
> <address@hidden
> > <mailto:address@hidden>> escreveu:
> >
> > __
> >
> > Pessoal,
> > estou fazendo um script que coleta o tamanho dos diretórios na raiz.
> Porém não quero colocar alguns
> > deles como: /proc, /sys, /dev
> >
> > Dentro do script eu coloquei o seguinte comando usando pattern match:
> > du -sh /!(proc|sys|dev)
> >
> > se eu executar o script aparece o seguinte erro:
> > ./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)
> >
> >
> >
> > --
> >
> > Leonardo Goretti
> > Gerência e Operações
> > Analista de infraestrutura - GNU/LINUX
> > Instrutor GNU/LINUX
> > Itil V3
> > Celular: +55 (61) 97402-3166
> >
> > Gtalk: address@hidden <mailto:leonardogoretti@gmail..com>
> > U2Ugdm9jw6ogZGVjcnlwdG91IMOpIHBvciBxdWUgc2FiZSBkYXMgY29pc2FzCg==
> > ----------------------------------------------
> >
> >
> >
> > ----------------------------------------------------------
> > Enviado por: Tiago Tarifa Munhoz <address@hidden>
> > ----------------------------------------------------------
> > Responder através da web
>
>
[Prev in Thread] Current Thread [Next in Thread]
- pattern match no bash, Tiago Tarifa Munhoz, 2018/08/10
- Re: [shell-script] pattern match no bash, Vinicius Costa Carvalho, 2018/08/10
- Re: [shell-script] pattern match no bash, 빠는 Leonardo Goretti, 2018/08/10
- Re: [shell-script] pattern match no bash, Tiago Tarifa Munhoz, 2018/08/10
- Re: [shell-script] pattern match no bash, 빠는 Leonardo Goretti, 2018/08/10
- Re: [shell-script] pattern match no bash, Tiago Peczenyj, 2018/08/10
- Re: [shell-script] pattern match no bash, Tiago Tarifa Munhoz, 2018/08/10
- Re: [shell-script] pattern match no bash, phfbettega, 2018/08/11
- Re: [shell-script] pattern match no bash, Tiago Tarifa Munhoz, 2018/08/12
- Re: [shell-script] pattern match no bash, Julio C. Neves <=
- Re: [shell-script] pattern match no bash, Tiago Tarifa Munhoz, 2018/08/14
- Prev by Date: Re: [shell-script] pattern match no bash
- Next by Date: Re: [shell-script] pattern match no bash
- Previous by thread: Re: [shell-script] pattern match no bash
- Next by thread: Re: [shell-script] pattern match no bash
- Index(es):