shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] o trio de comandos find cat grep


From: Julio C. Neves
Subject: Re: [shell-script] o trio de comandos find cat grep
Date: Mon, 16 Oct 2017 14:47:54 -0200

Pô Fernando.
Mac!? Macquequeisso!? Tsc, tsc, tsc... ;)

Gostei do ponto de interrogação colocando o "e" de jpeg como opcional.

O find tem uma opção, se não me engano regextype, que vc pode especificar qual set de regex vc está usando. Peraí, deixa dar uma pesquisada...

É isso mesmo: regextype: tipos válidos são "findutils-default", "awk", "egrep", "ed", "emacs", "gnu-awk", "grep", "posix-awk", "posix-basic", "posix-egrep", "posix-extended", "posix-minimal-basic", "sed".

Se eu fosse vc sairia dessa vala comum e voltaria para o seu bom e velho Debian ;) Kkkk

Novidade! Dia 08/11​ abriremos as inscrições para um treinamento
de Shell Script que será lecionado em 5 semanas no formato EAD
e que será ministrado por Julio Neves e Rubens Queiroz (dicas-l)

Abcs,
Julio

Damos treinamento em sua empresa com certificado
e nota fiscal por um preço, no mínimo, 50% mais
barato que qualquer curso.

​​
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 16 de outubro de 2017 12:54, Fernando Mercês address@hidden [shell-script] <address@hidden> escreveu:
 

Wow. -iregex matou a pau. Muito bom, Julio! :-)

No macOS precisou da opção -E do find, pra interpretar o "ou da regex |":

     -E      Interpret regular expressions followed by -regex and -iregex pri-
             maries as extended (modern) regular expressions rather than basic
             regular expressions (BRE's).  The re_format(7) manual page fully
             describes both formats.


Aí fiz assim (usando a interrogação pra diminuir um "ou"):

$ find -E . -type f -iregex '.*\.(jpe?g|gif|bmp)$'

Sempre aprendo nessa lista! Valeu a todos!


Att,

@MercesFernando
mentebinaria.com.br
---------------------------

2017-10-16 9:57 GMT-02:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden.br>:
 

Caro Jorge,
vou aproveitar a sua dúvida para dar uma dica para a lista:

=====
Sempre que vc pensar em usar um cmd cat dentro de um script, repense, pois deve ser desnecessário
=====

É muito frequente fazermos coisas do tipo cat ARQ | CMD. 99% das vezes o CMD aceita ARQ como parâmetro. P.ex.:
Troque: cat ARQ | grep CADEIA
Por: grep CADEIA ARQ

Troque: cat ARQ | cut PARMS
Por: cut PARMS ARQ
Onde: PARMS = -d, -f, -s, ...

Tb é comum, em cmds que só aceitam os dados de ARQ vindos pela entrada primária, vermos o tal do cat desnecessário. P.ex.:
Troque: cat ARQ | tr X Y
Por: tr X Y < ARQ

Veja isso:
$ wc -l ARQ
4 ARQ
Normalmente vc só quer a qtd de linhas, não importa o nome. Então para ludibriar o cmd e ele não sabero o nome do arquivo vc faz:
$ cat ARQ | wc -l
4
Aconteceu o que vc queria, mas vc pode fazer o mesmo de forma bem mais otimizada, fazendo:
$ wc -l < ARQ
4

O shell passará somente os dados de ARQ para o wc contar e ele não saberá o nome do arquivo para listar.

Jamais se esqueça que o pipe é tremendamente útil, mas ele cria um fork, gerando um subshell.

Recomendo que, à luz do que expliquei, vc façam:

$ grep -l cat /diretorio/dos/meus/scripts/*
Isso irá gerar o nome de todos os seus scripts que usam o cmd cat. Analise um por um e vc verá que existe muita coisa que pode ser otimizada.

Agora, voltando à dúvida do Jorge, que a essa altura já deve ter descartado o uso do cat. Jorge o seu find pode ser otimizado para o seguinte formato:

find . type f -iname \*.jpg -o -iname \*.jpeg -o -iname \*.bmp -o -iname \*.png -o -iname \*.gif

ou, mais facilmente:

find . -type f -iregex '.*\(jpg\|jpeg\|png\|gif\)'

Novidade! Dia 08/11​ abriremos as inscrições para um treinamento
de Shell Script que será lecionado em 5 semanas no formato EAD
e que será ministrado por Julio Neves e Rubens Queiroz (dicas-l)
Todos os detalhes em:

Abcs,
Julio

Damos treinamento em sua empresa com certificado
e nota fiscal por um preço, no mínimo, 50% mais
barato que qualquer curso.

​​
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 16 de outubro de 2017 05:47, Jorge Barros de Abreu address@hidden [shell-script] <address@hidden.br> escreveu:
 

Olá

Eu usava 'find' e gravava em um arquivo e depois usava um 'cat' para jogar no 'grep'.

Recentemente tive problemas com o trio de comandos acima.
O problema tinha a ver (provavelmente) com nomes de arquivos vindos de sistemas
operacionais diferentes e com acentos e com espaços.

Na internet tem diversas soluções para renomear arquivos.
Não achei nenhuma que resolvesse ***todos*** os problemas.
Alguns arquivos tive de sair na violencia mesmo.
Renomear um por um. :-))).

O que me chamou a atenção nessa coisa toda foi o comando abaixo
que compartilho agora:

find . '(' -type f -name '*.jpg' -o -name '*.jpeg' -o -name '*.JPEG' -o -name '*.JPG' -o -name '*.bmp' -o -name '*.png' -o -name '*.gif' ')'

O motivo de usar o comando acima foi que o grep estava abortando
em algum momento (não sei o motivo).

Foi o que resolveu meu problema.
Eliminei o cat e o grep.

A título de enriquecimento do diálogo faço a seguinte pergunta:

Existe alguma chave ou opção de linha de comando que melhore o comportamento
do grep e evitar que ele aborte inesperadamente e sem nenhuma mensagem de erro???

Obrigado.
Até.

--
Data Estelar 2458042,860336
http://sites.google.com/site/ficmatinf
Desejo-lhe Paz, Vida Longa e Prosperidade.
São Bem Vindas Mensagens no Formato texto UTF-8 com Acentos.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]