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 09:57:26 -0200

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> 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]