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

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

Re: [shell-script] Copiar arquivo para as pastas


From: Felipe Kellermann
Subject: Re: [shell-script] Copiar arquivo para as pastas
Date: Wed, 14 Apr 2004 16:47:07 -0300 (BRT)

On Wed, 14 Apr 2004 2:15pm  -0300, Julio Cezar Neves - DATAPREVRJ wrote:

> mindepth pq não tinha certeza se seria - mindepth 1 ou -mindepth 0 e como
> estava escrevendo a linha direto no e-mail sem testar bateu uma prequiça de
> ir ao man...

É... é uma questão de estruturas  :-)
Mas aqui vão algumas dicas interessantes sobre o assunto...


> Veja esta observação tirada de Unix Power Tools, first edition (O'Reilly &
> Associates):
>
> The modern UNIX OS seems to have solved the problem of the find command
> overflowing the command-line buffer. However, using the find -exec command
> is still troublesome. It's better to do this:
> # remove all files with a txt extension
> find . -type f -name "*.txt" -print|xargs rm
> than this:
> find . -type f -name "*.txt" -exec rm {} \; -print
>
> Por outro lado eu fiz um teste de performance com um grep recursivo, e com o
> xargs foi muuuiiiito mais rápido que com o exec. Experimente vc mesmo:

Eu tenho a segunda edição do UPT.  Acho uma boa referência, mas devo te
admitir que eu interpretaria a sugestão deles de maneira diferente.  Mas
de qualquer forma, apesar de eu não ter certeza se eles comentam isso no
livro:  Esse caso não tem nada a ver com o caso que estávamos vendo.

E qual é a diferença?  Enorme.  Eles não estão fazendo substituições.
A minha explicação está logo abaixo do teu exemplo, aqui:


> find / -type f -exec grep -l "cadeia" {} \;
> find / -type f | xarg grep -l "cadeia"

Sim, esse caso, sim.  Vai ser melhor.  Não tenho nenhuma dúvida.
É para isso que o `xargs' serve, originalmente...  Outra questão  :-)

Mas tu tá te esquecendo de uma característica:  A opção `i' vai, com
razão, implicar no processamento por linhas normal, novamente.  Aqui:

$ echo "fuu\nbar" | xargs echo
fuu bar

$ echo "fuu\nbar" | xargs -i echo {}
fuu
bar


Daqui, concluímos que é até muito pior usar o xargs nesses casos.
Além de não fazer aquilo que ele é usualmente usado para fazer, vai estar
sendo um processamento morto e nós vamos estar gastando recursos à toa.

Tu conseguiria resolver isso e tornar ele novamente "útil"?  Sim, e de
diferentes formas, incluindo uma estranhamente interessante e outras mais
lógicas (do primeiro caso, AFAIK -- li quando era guri, há comentários no
UPT, pelo menos).  Mas isso vai ficar de exercício ao leitor  :-)


(sidenote)
PS:  Queria dizer também que _nenhuma_ dessas alternativas seria a minha
opção ideal.  Costumo manter o assunto porque é assim que as coisas eram
feitas, mas não é assim que as coisas precisam ser feitas.


> | $ cp arq /home/*
>
> Esta é a saída mais óbvia, mais otimizada e mais tudo. Fico danado qdo não
> vejo o óbvio...;(

Mas ela ainda tem o problema do possível limite ARG_MAX que aqui entraria
o xargs mas sem o caso da substituição.  Resolvendo, portanto, o problema
de forma completa.  Na minha opinião.


> Valeu Felipe, pelo menos deixamos na lista uma discussão produtiva.
> Vc respondeu ao Aurélio o convite que ele nos fez para sermos juízes de um
> concurso? Eu aceitei.

Respondi.
Até mais,

-- 
Felipe Kellermann


reply via email to

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